Problem 123 「素数の自乗で割った余り」 †

pn を n 番目の素数とする. (p1 = 2, p2 = 3, ...) r を (pn - 1)n + (pn + 1)n を pn^2 で割った余りとする.

例えば, n = 3 のとき, p3 = 5 であり, 4^3 + 6^3 = 280 ≡ 5 mod 25.

余り r が 10^9 より大きくなる n の最小値は 7037 である.

余り r が 10^10 より大きくなる最初の n を求めよ.

解法
愚直に小さいほうから試す以外思いつきません。
何か賢い解法でもあるものでしょうか?


not_prime(N):-
	between(2,N,D),
	(D*D>N->!,fail;true),
	N mod D=:=0,
	!.
is_prime(N):-not(not_prime(N)).


search(N,No):-
	is_prime(N),
	!,
	No1 is No+1,
	N1 is N+1,
	(No1 mod 2=:=0->M is 2;M is 2*N*No1),
	(M>10^10->!,write(No1);search(N1,No1)).
search(N,No):-
	!,
N1 is N+1,
	search(N1,No).
main123:-
	search(2,0).

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2014年03月09日 00:43