Add sumDivisors and peterson implementation
parent
826b37d405
commit
7d9c4a6d3e
@ -1,47 +0,0 @@
|
|||||||
// For more information see https://aka.ms/fsharp-console-apps
|
|
||||||
printfn "Hello from F#"
|
|
||||||
|
|
||||||
// printfn "%A" ((fun x -> x+1)3)
|
|
||||||
|
|
||||||
let ratio(x,y) =
|
|
||||||
let z = x * y
|
|
||||||
let w = 2 * (x + y)
|
|
||||||
w / z
|
|
||||||
|
|
||||||
let ratio2(x : float, y : float) =
|
|
||||||
let z = x * y
|
|
||||||
let w = ((2 : float) * x) + ((2 : float) * y)
|
|
||||||
w / z
|
|
||||||
|
|
||||||
printfn "%A" (ratio2(2.1,3.0))
|
|
||||||
|
|
||||||
let getType(x) = x.GetType().FullName
|
|
||||||
|
|
||||||
let rec Fib (n : int) =
|
|
||||||
if (n = 0 || n = 1) then 1
|
|
||||||
else Fib (n - 1) + Fib (n - 2)
|
|
||||||
|
|
||||||
let TrNum (n : int) = n*(n+1)/2
|
|
||||||
|
|
||||||
printfn "%A" (TrNum(10))
|
|
||||||
|
|
||||||
let rec ProdNum (n : int) =
|
|
||||||
match n with
|
|
||||||
| 1 -> 1
|
|
||||||
| _ -> ProdNum(n-1)*n
|
|
||||||
|
|
||||||
let rec sumFirstFun f k =
|
|
||||||
if k<=0 then 0 else f k + sumFirstFun f (k-1)
|
|
||||||
|
|
||||||
let rec fold g f k1 k2 z =
|
|
||||||
if (k2 < k1) then z
|
|
||||||
else g (fold g f (k1+1) k2 z) (f(k1))
|
|
||||||
|
|
||||||
let sum x y = x + y
|
|
||||||
let double x = 2*x
|
|
||||||
|
|
||||||
printfn "%A" (fold sum double 10 100 0)
|
|
||||||
|
|
||||||
printfn "%A" (ProdNum(5))
|
|
||||||
|
|
||||||
printfn "%A" (Fib (5))
|
|
@ -1,113 +0,0 @@
|
|||||||
let rec foldLeft g f k1 k2 z =
|
|
||||||
if k1 >= k2 then g(z,f(k1))
|
|
||||||
else g(foldLeft g f k1 (k2-1) z, f k2)
|
|
||||||
|
|
||||||
|
|
||||||
let rec foldRight g f k1 k2 z =
|
|
||||||
if k1 >= k2 then g(f(k1),z)
|
|
||||||
else g(f k1, foldRight g f (k1+1) k2 z)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let list1 = [1; 2; 3]
|
|
||||||
let list2 = [1,2,3]
|
|
||||||
let list2' = [(1,2,3)]
|
|
||||||
let list3 = (1,2,3)
|
|
||||||
let list4 = []
|
|
||||||
let list5 = 4::list1
|
|
||||||
|
|
||||||
let rec lngth lst =
|
|
||||||
if lst = []
|
|
||||||
then 0
|
|
||||||
else 1 + (lngth (List.tail lst))
|
|
||||||
|
|
||||||
//printfn "%A" (lngth [1;3;4])
|
|
||||||
|
|
||||||
let rec invList l i =
|
|
||||||
if l = [] then []
|
|
||||||
else if ((List.length l) - i) = 0 then [List.head l]
|
|
||||||
else
|
|
||||||
l[List.length l - i] :: (invList l (i+1))
|
|
||||||
|
|
||||||
//printfn "%A" (invList [1;2;3;4] 1)
|
|
||||||
|
|
||||||
let reverseList l =
|
|
||||||
let rec reverseL acc l =
|
|
||||||
if l = [] then acc
|
|
||||||
else
|
|
||||||
reverseL ( (List.head l) :: acc) (List.tail l)
|
|
||||||
reverseL [] l
|
|
||||||
|
|
||||||
//printfn "%A" (reverseList [1;2;3;4])
|
|
||||||
|
|
||||||
let rec sumList (l: int list) =
|
|
||||||
if l = [] then 0
|
|
||||||
else
|
|
||||||
List.head l + sumList (List.tail l)
|
|
||||||
|
|
||||||
let rec maxL (l : int list) (max : int) =
|
|
||||||
if l = [] then max
|
|
||||||
else
|
|
||||||
if (List.head l) > max then maxL (List.tail l) (List.head l)
|
|
||||||
else maxL (List.tail l) max
|
|
||||||
|
|
||||||
let maxList l = if l= [] then failwith "Lista vuota" else maxL l (List.head l)
|
|
||||||
|
|
||||||
//printfn "%A" (sumList [1;2;3;4])
|
|
||||||
|
|
||||||
//printfn "%A" (maxList [1;2;3;4])
|
|
||||||
|
|
||||||
//printfn "%A" (maxList [])
|
|
||||||
|
|
||||||
let rec fib x =
|
|
||||||
match x with
|
|
||||||
| 1 -> 1
|
|
||||||
| 2 -> 1
|
|
||||||
| n -> fib (n-1) + fib (n-2)
|
|
||||||
|
|
||||||
let rec fib2 x =
|
|
||||||
match x with
|
|
||||||
| n when n < 1 -> failwith (sprintf "Error: %d is less than 1" x)
|
|
||||||
| (1|2) -> 1
|
|
||||||
| n -> fib (n-1) + fib (n-2)
|
|
||||||
|
|
||||||
let rec fn2 a =
|
|
||||||
match a with
|
|
||||||
| (x,y) when x > 0 && y > 0 -> x + y
|
|
||||||
| (x,_) when x < 0 -> 0
|
|
||||||
| _ -> failwith "This makes no sense"
|
|
||||||
|
|
||||||
let rec length2 l =
|
|
||||||
match l with
|
|
||||||
| [] -> 0
|
|
||||||
| _ :: xs -> 1 + (length2 xs)
|
|
||||||
|
|
||||||
let rec nth i l =
|
|
||||||
match (i,l) with
|
|
||||||
| (_,[]) -> failwith "Errore: ricorsione termina in lista vuota"
|
|
||||||
| (0, x :: _) -> x
|
|
||||||
| (n, _ :: xs) when n > 0 -> nth (n-1) xs
|
|
||||||
| _ -> failwith "Errore: indice negativo"
|
|
||||||
|
|
||||||
// printfn "%A" (nth 4 [1;2;3;4;5])
|
|
||||||
|
|
||||||
let rec EuclidsAlg n m =
|
|
||||||
match (a,b) with
|
|
||||||
| _ when (a <= 0 || b <= 0) -> failwith "Errore: almeno un numero non positivo"
|
|
||||||
| _ when (a = b) -> a
|
|
||||||
| _ when (a > b) -> EuclidsAlg (a-b) b
|
|
||||||
| _ -> EuclidsAlg a (b-a)
|
|
||||||
|
|
||||||
let rec unzip l =
|
|
||||||
match l with
|
|
||||||
| [] -> ([],[])
|
|
||||||
| (a,b) :: xs -> (a :: (fst (unzip xs)), b :: (snd (unzip xs)));;
|
|
||||||
|
|
||||||
// printfn "%A" (EuclidsAlg 48 12)
|
|
||||||
|
|
||||||
let rec unzip' l =
|
|
||||||
match l with
|
|
||||||
| [] -> ([],[])
|
|
||||||
| (a,b) :: xs ->
|
|
||||||
let (aa,bb) = unzip xs
|
|
||||||
(a :: aa, b :: bb)
|
|
@ -0,0 +1,87 @@
|
|||||||
|
#include <pthread.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
// This program illustrates the use of Peterson's algorithm to synchronize
|
||||||
|
// multiple threads.Two new threads are created and alternate writing to the
|
||||||
|
// standard output.
|
||||||
|
//
|
||||||
|
// The key difference between Peterson's algorithm and strict alternation is
|
||||||
|
// the inclusion of flags indicating whether a thread is ready to enter the
|
||||||
|
// critical section.
|
||||||
|
|
||||||
|
// This function is taken from `~/.local/src/dwm/util.c`.
|
||||||
|
//
|
||||||
|
// Print the error message and `perror` if the message ends in `':'`. Assumes
|
||||||
|
// `fmt` is not `NULL`.
|
||||||
|
void die(const char* fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
// Following Unix convention (see `man perror`), first check if the string is
|
||||||
|
// not empty.
|
||||||
|
if(fmt[0] && fmt[strlen(fmt) - 1] == ':') {
|
||||||
|
fputc(' ', stderr);
|
||||||
|
perror(NULL);
|
||||||
|
} else {
|
||||||
|
fputc('\n', stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The `turn` variable indicates which thread should enter the critical
|
||||||
|
// section. Unlike strict alternation, the `turn` variable is set _before_
|
||||||
|
// entering the critical section.
|
||||||
|
//
|
||||||
|
// Note that globally-scoped variables are initialized to zero.
|
||||||
|
int turn;
|
||||||
|
int flag[2];
|
||||||
|
|
||||||
|
void* f0(void* arg) {
|
||||||
|
while(1) {
|
||||||
|
// Signal that this thread wants to enter the critical section.
|
||||||
|
flag[0] = 1;
|
||||||
|
// Signal to the other thread that it is their turn.
|
||||||
|
turn = 1;
|
||||||
|
while(flag[1] && turn == 1);
|
||||||
|
puts("hello");
|
||||||
|
flag[0] = 0;
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void* f1(void* arg) {
|
||||||
|
while(1) {
|
||||||
|
flag[1] = 1;
|
||||||
|
turn = 0;
|
||||||
|
while(flag[0] && turn == 0);
|
||||||
|
puts("world");
|
||||||
|
flag[1] = 0;
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
// A POSIX thread has two main components: an object of type `pthread_t`
|
||||||
|
// which represents the thread and a function pointer of type
|
||||||
|
// `void* (*)(void*)` which will be the entry point of the thread.
|
||||||
|
pthread_t t0, t1;
|
||||||
|
|
||||||
|
// Creates new threads. The second argument is a pointer to a
|
||||||
|
// `pthread_attr_t`, if `NULL` the thread is created with default attributes.
|
||||||
|
// The last argument is the argument that is given to the thread's entry
|
||||||
|
// point function, unused in this example.
|
||||||
|
if(pthread_create(&t0, NULL, f0, NULL)) die("unable to create thread");
|
||||||
|
if(pthread_create(&t1, NULL, f1, NULL)) die("unable to create thread");
|
||||||
|
|
||||||
|
// Yes, I could have just created one thread.
|
||||||
|
while(1);
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
open System
|
||||||
|
|
||||||
|
let factorsWithMolteplicity n =
|
||||||
|
let rec loop c p =
|
||||||
|
if c < (p * p) then [c]
|
||||||
|
elif c % p = 0 then p :: (loop (c/p) p)
|
||||||
|
else loop c (p + 1)
|
||||||
|
loop n 2
|
||||||
|
|> List.countBy id
|
||||||
|
|
||||||
|
let isPerfect n =
|
||||||
|
let sumDiv k =
|
||||||
|
k
|
||||||
|
|> factorsWithMolteplicity
|
||||||
|
|> List.map (fun (p,m) -> ((pown p (m+1))-1)/(p-1))
|
||||||
|
|> List.fold (*) 1
|
||||||
|
sumDiv n = 2*n
|
||||||
|
|
||||||
|
// brute-force approach
|
||||||
|
let divisors n =
|
||||||
|
[1..n/2]
|
||||||
|
|> Seq.filter (fun f -> n % f = 0)
|
||||||
|
let sumProperDivisors n =
|
||||||
|
n
|
||||||
|
|> divisors
|
||||||
|
|> Seq.sum
|
||||||
|
|
||||||
|
// perfect
|
||||||
|
let isPerfect2 n = (sumProperDivisors n = n)
|
||||||
|
|
||||||
|
let timer = new System.Diagnostics.Stopwatch()
|
||||||
|
timer.Start()
|
||||||
|
printfn "%A" (isPerfect 8128)
|
||||||
|
timer.Stop()
|
||||||
|
printfn "%f" timer.Elapsed.TotalMilliseconds
|
||||||
|
printfn "Elapsed Time: %i" timer.ElapsedMilliseconds
|
||||||
|
|
||||||
|
let timer2 = new System.Diagnostics.Stopwatch()
|
||||||
|
timer2.Start()
|
||||||
|
printfn "%A" (isPerfect2 8128)
|
||||||
|
timer2.Stop()
|
||||||
|
printfn "%f" timer2.Elapsed.TotalMilliseconds
|
||||||
|
printfn "Elapsed Time: %i" timer2.ElapsedMilliseconds
|
@ -0,0 +1,24 @@
|
|||||||
|
N=1e7;
|
||||||
|
|
||||||
|
for n=2:N
|
||||||
|
% A contains the unique prime factors of n; M their multiplicities
|
||||||
|
[A,M]=factor(n);
|
||||||
|
l=length(A);
|
||||||
|
s=1;
|
||||||
|
for i=1:l
|
||||||
|
% formula for the sum of divisors of p^k
|
||||||
|
c(i)=((A(i)^(M(i)+1))-1)/(A(i)-1);
|
||||||
|
s*=c(i);
|
||||||
|
end
|
||||||
|
if 2*n==s
|
||||||
|
printf("%d is Perfect!\n",n)
|
||||||
|
m=n;
|
||||||
|
k=0;
|
||||||
|
while mod(m,2)==0
|
||||||
|
m=m/2;
|
||||||
|
k++;
|
||||||
|
end
|
||||||
|
k++;
|
||||||
|
printf("The corresponding Mersenne prime is %d\n",((2^k)-1))
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue