Carmichael 3 strong pseudoprimes: Difference between revisions

→‎{{header|F_Sharp|F#}}: Use extensible prime generator
(Realize in F#)
(→‎{{header|F_Sharp|F#}}: Use extensible prime generator)
Line 487:
 
=={{header|F_Sharp|F#}}==
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_function Extensible Prime Generator (F#)]
<lang fsharp>
// Carmichael Number . Nigel Galloway: November 19th., 2017
let fIfN n = Seq.collect ((fun g->(n,g))>>(fun (n,g)->Seq.map(fun e->(n,1+(n-1)*(n+g)/e,g,e))){1..(n+g-1)}))({2..(n-1)})
let rec isPrime n =
let rec fN i g e l = if l>=e then true else if i%l=0 then false else fN i (g+1) (i/l) (Seq.item (g+1) primes)
if n<2 then false else fN n 0 n 2
and primes = Seq.cache(seq{yield! {2..3}; yield! (Seq.unfold (fun n->Some(n, n + 2)) 5 |> Seq.filter isPrime )})
let fI n = Seq.collect ((fun g->(n,g))>>(fun (n,g)->Seq.map(fun e->(n,1+(n-1)*(n+g)/e,g,e)){1..(n+g-1)}))({2..(n-1)})
let fG (P1,P2,h3,d) =
let mod' n g = (n%g+g)%g
let fN P3 = if isPrime P3 && (P2*P3)%(P1-1)=1 then Some (P1,P2,P3) else None
if isPrime P2 && ((h3+P1)*(P1-1))%d=0 && mod' (-P1*P1) h3=d%h3 then fN (1+P1*P2/h3) else None
let ncarms g = primes|>Seq.takeWhile(fun n->n<=61g)|>Seq.collect fIfN|>Seq.choose fG
ncarms 61 |> Seq.iter (fun (P1,P2,P3)->printfn "%2d x %4d x %5d = %10d" P1 P2 P3 ((uint64 P3)*(uint64 (P1*P2))))
</lang>
{{out}}
Line 573 ⟶ 570:
61 x 3361 x 4021 = 824389441
</pre>
 
 
=={{header|Fortran}}==
2,172

edits