How to resolve the algorithm Wilson primes of order n step by step in the Prolog programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Wilson primes of order n step by step in the Prolog programming language
Table of Contents
Problem Statement
A Wilson prime of order n is a prime number p such that p2 exactly divides:
If n is 1, the latter formula reduces to the more familiar: (p - n)! + 1 where the only known examples for p are 5, 13, and 563.
Calculate and show on this page the Wilson primes, if any, for orders n = 1 to 11 inclusive and for primes p < 18 or, if your language supports big integers, for p < 11,000.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Wilson primes of order n step by step in the Prolog programming language
Source code in the prolog programming language
main:-
wilson_primes(11000).
wilson_primes(Limit):-
writeln(' n | Wilson primes\n---------------------'),
make_factorials(Limit),
find_prime_numbers(Limit),
wilson_primes(1, 12, -1).
wilson_primes(N, N, _):-!.
wilson_primes(N, M, S):-
wilson_primes(N, S),
S1 is -S,
N1 is N + 1,
wilson_primes(N1, M, S1).
wilson_primes(N, S):-
writef('%3r |', [N]),
N1 is N - 1,
factorial(N1, F1),
is_prime(P),
P >= N,
PN is P - N,
factorial(PN, F2),
0 is (F1 * F2 - S) mod (P * P),
writef(' %w', [P]),
fail.
wilson_primes(_, _):-
nl.
make_factorials(N):-
retractall(factorial(_, _)),
make_factorials(N, 0, 1).
make_factorials(N, N, F):-
assert(factorial(N, F)),
!.
make_factorials(N, M, F):-
assert(factorial(M, F)),
M1 is M + 1,
F1 is F * M1,
make_factorials(N, M1, F1).
:- module(prime_numbers, [find_prime_numbers/1, is_prime/1]).
:- dynamic is_prime/1.
find_prime_numbers(N):-
retractall(is_prime(_)),
assertz(is_prime(2)),
init_sieve(N, 3),
sieve(N, 3).
init_sieve(N, P):-
P > N,
!.
init_sieve(N, P):-
assertz(is_prime(P)),
Q is P + 2,
init_sieve(N, Q).
sieve(N, P):-
P * P > N,
!.
sieve(N, P):-
is_prime(P),
!,
S is P * P,
cross_out(S, N, P),
Q is P + 2,
sieve(N, Q).
sieve(N, P):-
Q is P + 2,
sieve(N, Q).
cross_out(S, N, _):-
S > N,
!.
cross_out(S, N, P):-
retract(is_prime(S)),
!,
Q is S + 2 * P,
cross_out(Q, N, P).
cross_out(S, N, P):-
Q is S + 2 * P,
cross_out(Q, N, P).
You may also check:How to resolve the algorithm Determine if only one instance is running step by step in the Ring programming language
You may also check:How to resolve the algorithm Entropy step by step in the Swift programming language
You may also check:How to resolve the algorithm SEDOLs step by step in the Sidef programming language
You may also check:How to resolve the algorithm String matching step by step in the LabVIEW programming language
You may also check:How to resolve the algorithm Canonicalize CIDR step by step in the Raku programming language