Deceptive numbers: Difference between revisions
Content added Content deleted
(→UNIX Shell: add) |
(→UNIX Shell: simplify) |
||
Line 171: | Line 171: | ||
/* wheel to skip multiples of 2, 3, and 5 */ |
/* wheel to skip multiples of 2, 3, and 5 */ |
||
w[0] = |
w[0] = 4 |
||
w[1] = |
w[1] = 2 |
||
w[2] = |
w[2] = 4 |
||
w[3] = |
w[3] = 2 |
||
w[4] = |
w[4] = 4 |
||
w[5] = |
w[5] = 6 |
||
w[6] = |
w[6] = 2 |
||
w[7] = |
w[7] = 6 |
||
for (n = |
for (n = p[0]; c != 10; i = (i + 1) % 8) { |
||
if (d(n) == 1) { |
if (d(n += w[i]) == 1) { |
||
n |
n |
||
c += 1 |
c += 1 |
||
} |
} |
||
n += w[i] |
|||
}</syntaxhighlight> |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 1,231: | Line 1,230: | ||
=={{header|UNIX Shell}}== |
=={{header|UNIX Shell}}== |
||
Works with [[POSIX]]-compatible shells. |
|||
<syntaxhighlight lang="sh">is () { |
<syntaxhighlight lang="sh">is () { |
||
return "$((!($1)))" |
return "$((!($1)))" |
||
} |
} |
||
fermat_test () { |
|||
set -- 1 "$ |
set -- 1 "$1" "$(($2 - 1))" "$2" |
||
while is "$3 |
while is "$3 > 0" |
||
do |
do |
||
set -- "$(($1 * (($2 ^ 1) * ($3 & 1) ^ 1) % $4))" "$(($2 * $2 % $4))" "$(($3 >> 1))" "$4" |
set -- "$(($1 * (($2 ^ 1) * ($3 & 1) ^ 1) % $4))" "$(($2 * $2 % $4))" "$(($3 >> 1))" "$4" |
||
done |
done |
||
return "$(($1 != 1))" |
|||
} |
} |
||
⚫ | |||
c=0 n= |
c=0 n=$1 |
||
⚫ | |||
while : |
while : |
||
do |
do |
||
for w in 4 2 4 2 4 6 2 6 |
for w in 4 2 4 2 4 6 2 6 |
||
do |
do |
||
fermat_test 10 "$((n += w))" && for p |
|||
is "$(modpow 10 "$((n - 1))" "$n") == 1" && for p |
|||
do |
do |
||
is 'p * p > n' && { |
is 'p * p > n' && { |