Blum integer: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Minor correction to output.) |
(Created Nim solution.) |
||
Line 318: | Line 318: | ||
end |
end |
||
</syntaxhighlight>{{out}} Same as Wren, Go, etc |
</syntaxhighlight>{{out}} Same as Wren, Go, etc |
||
=={{header|Nim}}== |
|||
{{trans|Wren}} |
|||
<syntaxhighlight lang="Nim">import std/[strformat, tables] |
|||
func isPrime(n: Natural): bool = |
|||
## Return "true" is "n" is prime. |
|||
if n < 2: return false |
|||
if (n and 1) == 0: return n == 2 |
|||
if n mod 3 == 0: return n == 3 |
|||
var d = 5 |
|||
var step = 2 |
|||
while d * d <= n: |
|||
if n mod d == 0: |
|||
return false |
|||
inc d, step |
|||
step = 6 - step |
|||
return true |
|||
const Inc = [4, 2, 4, 2, 4, 6, 2, 6] |
|||
func firstPrimeFactor(n: Positive): int = |
|||
## Return the first prime factor. |
|||
## Assuming "n" is odd. |
|||
if n == 1: return 1 |
|||
if n mod 3 == 0: return 3 |
|||
if n mod 5 == 0: return 5 |
|||
var k = 7 |
|||
var i = 0 |
|||
while k * k <= n: |
|||
if n mod k == 0: |
|||
return k |
|||
k += Inc[i] |
|||
i = (i + 1) and 7 |
|||
return n |
|||
var blum = newSeq[int](50) |
|||
var bc = 0 |
|||
var counts: CountTable[int] |
|||
var n = 1 |
|||
while true: |
|||
var p = n.firstPrimeFactor |
|||
if (p and 3) == 3: |
|||
let q = n div p |
|||
if q != p and (q and 3) == 3 and q.isPrime: |
|||
if bc < 50: blum[bc] = n |
|||
counts.inc(n mod 10) |
|||
inc bc |
|||
if bc == 50: |
|||
echo "First 50 Blum integers:" |
|||
for i, val in blum: |
|||
stdout.write &"{val:3}" |
|||
stdout.write if i mod 10 == 9: '\n' else: ' ' |
|||
echo() |
|||
elif bc == 26828 or bc mod 100000 == 0: |
|||
echo &"The {bc:>6}th Blum integer is: {n:>7}" |
|||
if bc == 400000: |
|||
echo "\n% distribution of the first 400_000 Blum integers:" |
|||
for i in [1, 3, 7, 9]: |
|||
echo &" {counts[i]/4000:6.5} % end in {i}" |
|||
break |
|||
n = if n mod 5 == 3: n + 4 else: n + 2 |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre>First 50 Blum integers: |
|||
21 33 57 69 77 93 129 133 141 161 |
|||
177 201 209 213 217 237 249 253 301 309 |
|||
321 329 341 381 393 413 417 437 453 469 |
|||
473 489 497 501 517 537 553 573 581 589 |
|||
597 633 649 669 681 713 717 721 737 749 |
|||
The 26828th Blum integer is: 524273 |
|||
The 100000th Blum integer is: 2075217 |
|||
The 200000th Blum integer is: 4275533 |
|||
The 300000th Blum integer is: 6521629 |
|||
The 400000th Blum integer is: 8802377 |
|||
% distribution of the first 400_000 Blum integers: |
|||
25.001 % end in 1 |
|||
25.017 % end in 3 |
|||
24.997 % end in 7 |
|||
24.985 % end in 9 |
|||
</pre> |
|||
=={{header|Pascal}}== |
=={{header|Pascal}}== |
||
==={{header|Free Pascal}}=== |
==={{header|Free Pascal}}=== |