Fermat numbers: Difference between revisions
Content added Content deleted
(add PicoLisp) |
|||
Line 1,012: | Line 1,012: | ||
F[12] = 114689 * 26017793 * 63766529 * (C1213) |
F[12] = 114689 * 26017793 * 63766529 * (C1213) |
||
</pre> |
</pre> |
||
=={{header|jq}}== |
|||
'''Works with gojq, the Go implementation of jq''' |
|||
'''Preliminaries''' |
|||
<lang jq># To take advantage of gojq's arbitrary-precision integer arithmetic: |
|||
def power($b): . as $in | reduce range(0;$b) as $i (1; . * $in); |
|||
def gcd(a; b): |
|||
# subfunction expects [a,b] as input |
|||
# i.e. a ~ .[0] and b ~ .[1] |
|||
def rgcd: if .[1] == 0 then .[0] |
|||
else [.[1], .[0] % .[1]] | rgcd |
|||
end; |
|||
[a,b] | rgcd; |
|||
# This is fast because the state of `until` is just a number |
|||
def is_prime: |
|||
. as $n |
|||
| if ($n < 2) then false |
|||
elif ($n % 2 == 0) then $n == 2 |
|||
elif ($n % 3 == 0) then $n == 3 |
|||
elif ($n % 5 == 0) then $n == 5 |
|||
elif ($n % 7 == 0) then $n == 7 |
|||
elif ($n % 11 == 0) then $n == 11 |
|||
elif ($n % 13 == 0) then $n == 13 |
|||
elif ($n % 17 == 0) then $n == 17 |
|||
elif ($n % 19 == 0) then $n == 19 |
|||
elif ($n % 23 == 0) then $n == 23 |
|||
elif ($n % 29 == 0) then $n == 29 |
|||
elif ($n % 31 == 0) then $n == 31 |
|||
elif ($n % 37 == 0) then $n == 37 |
|||
elif ($n % 41 == 0) then $n == 41 |
|||
else 43 |
|||
| until( (. * .) > $n or ($n % . == 0); . + 2) |
|||
| . * . > $n |
|||
end;</lang> |
|||
'''Fermat Numbers''' |
|||
<lang jq>def fermat: |
|||
. as $n |
|||
| (2 | power( 2 | power($n))) + 1; |
|||
# https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm |
|||
def pollardRho($x): |
|||
. as $n |
|||
| def g: (.*. + 1) % $n ; |
|||
{x:$x, y:$x, d:1} |
|||
| until(.d != 1; |
|||
.x |= g |
|||
| .y |= (g|g) |
|||
| .d = gcd((.x - .y)|length; $n) ) |
|||
| if .d == $n then 0 |
|||
else .d |
|||
end ; |
|||
def rhoPrimeFactors: |
|||
. as $n |
|||
| pollardRho(2) |
|||
| if . == 0 |
|||
then [$n, 1] |
|||
else [., ($n / .)] |
|||
end ; |
|||
"The first 10 Fermat numbers are:", |
|||
[ range(0;10) | fermat ] as $fns |
|||
| (range(0;10) | "F\(.) is \($fns[.])"), |
|||
("\nFactors of the first 7 Fermat numbers:", |
|||
range(0;7) as $i |
|||
| $fns[$i] |
|||
| rhoPrimeFactors as $factors |
|||
| if $factors[1] == 1 |
|||
then "F\($i) : rho-prime", " ... => \(if is_prime then "prime" else "not" end)" |
|||
else "F\($i) => \($factors)" |
|||
end )</lang> |
|||
{{out}} |
|||
<pre> |
|||
The first 10 Fermat numbers are: |
|||
F0 is 3 |
|||
F1 is 5 |
|||
F2 is 17 |
|||
F3 is 257 |
|||
F4 is 65537 |
|||
F5 is 4294967297 |
|||
F6 is 18446744073709551617 |
|||
F7 is 340282366920938463463374607431768211457 |
|||
F8 is 115792089237316195423570985008687907853269984665640564039457584007913129639937 |
|||
F9 is 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084097 |
|||
Factors of the first 7 Fermat numbers: |
|||
F0 : rho-prime |
|||
... => prime |
|||
F1 : rho-prime |
|||
... => prime |
|||
F2 : rho-prime |
|||
... => prime |
|||
F3 : rho-prime |
|||
... => prime |
|||
F4 : rho-prime |
|||
... => prime |
|||
F5 => [641,6700417] |
|||
F6 => [274177,67280421310721] |
|||
</pre> |
|||
=={{header|Julia}}== |
=={{header|Julia}}== |