Unprimeable numbers: Difference between revisions

Content added Content deleted
(→‎{{header|Factor}}: lnth is a thing)
(Realize in F#)
Line 480: Line 480:
See [https://rosettacode.org/wiki/Unprimeable_numbers#Pascal Pascal].
See [https://rosettacode.org/wiki/Unprimeable_numbers#Pascal Pascal].


=={{header|F_Sharp|F#}}==
===The function===
This task uses [http://www.rosettacode.org/wiki/Extensible_prime_generator#The_functions Extensible Prime Generator (F#)]
<lang fsharp>
// Unprimeable numbers. Nigel Galloway: May 4th., 2021
let rec fN i g e l=seq{yield! [0..9]|>Seq.map(fun n->n*g+e+l); if g>1 then let g=g/10 in yield! fN(i+g*(e/g)) g (e%g) i}
let fG(n,g)=fN(n*(g/n)) n (g%n) 0|>Seq.exists(isPrime)
let uP()=let rec fN n g=seq{yield! {n..g-1}|>Seq.map(fun g->(n,g)); yield! fN(g)(g*10)} in fN 1 10|>Seq.filter(fG>>not)|>Seq.map snd
</lang>
===The Task===
<lang fsharp>
uP()|>Seq.take 35|>Seq.iter(printf "%d "); printfn ""
</lang>
{{out}}
<pre>
200 204 206 208 320 322 324 325 326 328 510 512 514 515 516 518 530 532 534 535 536 538 620 622 624 625 626 628 840 842 844 845 846 848 890
</pre>
<lang fsharp>
printfn "600th unprimable number is %d" (uP()|>Seq.item 599)
</lang>
{{out}}
<pre>
600th unprimable number is 5242
</pre>
<lang fsharp>
[0..9]|>Seq.iter(fun n->printfn "first umprimable number ending in %d is %d" n (uP()|>Seq.find(fun g->n=g%10)))
</lang>
{{out}}
<pre>
first umprimable number ending in 0 is 200
first umprimable number ending in 1 is 595631
first umprimable number ending in 2 is 322
first umprimable number ending in 3 is 1203623
first umprimable number ending in 4 is 204
first umprimable number ending in 5 is 325
first umprimable number ending in 6 is 206
first umprimable number ending in 7 is 872897
first umprimable number ending in 8 is 208
first umprimable number ending in 9 is 212159
Real: 00:01:01.419
</pre>
===Optimized for optional part of task===
The above general implementation can complete all of the task but takes over 1min for the optional part. The following completes the optional part in 3secs.
<lang fsharp>
let uPx x=let rec fN n g=seq{yield! {n+x..10..g-1}|>Seq.map(fun g->(max 1 n,g)); yield! fN(g)(g*10)} in fN 0 10|>Seq.filter(fG>>not)|>Seq.map snd
[0..9]|>Seq.iter(fun n->printfn "first umprimable number ending in %d is %d" n (uPx n|>Seq.head))
</lang>
{{out}}
<pre>
first umprimable number ending in 0 is 200
first umprimable number ending in 1 is 595631
first umprimable number ending in 2 is 322
first umprimable number ending in 3 is 1203623
first umprimable number ending in 4 is 204
first umprimable number ending in 5 is 325
first umprimable number ending in 6 is 206
first umprimable number ending in 7 is 872897
first umprimable number ending in 8 is 208
first umprimable number ending in 9 is 212159
Real: 00:00:03.158
</pre>
=={{header|Factor}}==
=={{header|Factor}}==
{{works with|Factor|0.99 2019-10-06}}
{{works with|Factor|0.99 2019-10-06}}