Deceptive numbers: Difference between revisions

Content added Content deleted
(→‎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] = 2
w[0] = 4
w[1] = 4
w[1] = 2
w[2] = 2
w[2] = 4
w[3] = 4
w[3] = 2
w[4] = 6
w[4] = 4
w[5] = 2
w[5] = 6
w[6] = 6
w[6] = 2
w[7] = 4
w[7] = 6


for (n = 11; c != 10; i = (i + 1) % 8) {
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)))"
}
}


modpow () {
fermat_test () {
set -- 1 "$@"
set -- 1 "$1" "$(($2 - 1))" "$2"
while is "$3 != 0"
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
echo "$1"
return "$(($1 != 1))"
}
}


set -- 7
c=0 n=7
c=0 n=$1
set -- "$n"
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
n=$((n + w))
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' && {