PRIMES決定性アルゴリズム
従来の代表的方法
伴地 慶介
a.試し割り算
● nP
d
1, n
p P
n
s.t d | n
s.t p | n
を 利用.
簡単かつ確実なアルゴ リ ズム だが、 計算量が指数時間O
n で
あり 小さ な n でないと 使い物になら ない.
・ 割り 算が最大 ( n 1) / 2 回. n 以下の整数の除算計算量はO(lg 2 n)BCで,
注意1.2.3(p16)の既知最速算法を 用いればO(lg n lg lg n lg lg lg n) O(lg n)BC.
よ っ て 試し 割り 算によ る PRIMESの入力 n に対する BCは,
O( n lg n lg lg n lg lg lg n) O( n lg 2 n) O( n ).
b.既約剰余類群の利用
● 定理 2. 2. 4 ModPPw と (2.11) によ る 同値性
≪参考≫
n P / n は位数 n 1 の巡回群 … (i)
・ 定理2. 2. 4( ModPPw)
p P, e
こ れを 利用する.し かし 制限があり , 条件を 現実に計算可能な形に
言い 直さ なければなら ない.
g
例えば, n P (n 1) ! 1 mod n
し かし こ れは階上計算が指数時間 O(n)BC にな る.
こ こ で n 1 の素因数全体 S : { p P | p | n 1}
{g1 g /( p /21)p
● nP
s.t b n1 1 mod n , b( n1)/ p 1 mod n p S … (ⅱ)
※ (4.3) よ り b n1 1 mod n の計算量は O(lg 2 n lg lg n lg lg lg n).
こ の計算を 各 p に対し 計算する ので, 一つの b に対する 計算量は
O( # S lg 2 n lg lg n lg lg lg n) # S lg 2 n である.
/p
e 1
n :
#
/ n
1
n n 1
p
pP
p| n
( p 2ま たはe 2)
/2
( p 2, e3)
e2
・ p43( 2. 11)
がわかる と き に注目し , (ⅱ) を 次に言い替える .
b
s.t
e
既約剰余類利用の問題点
● 問題①: ど う やっ て b を 探すか
各種PsPTによ り , 既に n P の可能性が高い.
n P な ら b は法 n の原始根PRP.
算法 2.2.3(PRP)の手順で早く 見つか る .
● 問題② : n 1の素因数の集合Sの計算
整数分解問題は指数時間….
(n 1 の部分的 PF T : { p P | p | m} (m , m | n 1, m n )
ができ ている と き に, (4.8) を 一般化し た n-1テス ト と いう も のが考え出さ れている . )
よ っ て素因子がわかっ ている
次の特殊なケ ース を 考える こ と にする .
・二の二べき乗+1(フェルマ数)の素数判定
●フ ェ ルマ数 Fm : 2 2 1 n ( m
m
≪参考≫
)
・ 定理 2.2.2
も し nP
( n 1)(31)/ 4 n
3
n
1
1 であ り ,
n
3 3
ま た n P 3
(n)
3
n , a / n a ( n ) 1 mod n
n 1
3
/ n に対し ,
3
22
m
・ (ⅱ)
3
n P 3( n 1)/ 2 mod n
n
1 32
1
PR で (ⅱ) を 満た す.
b
s.t
b n 1 1 mod n , b ( n 1) / p 1 mod n
mod n
つま り b 3 は位数 2 べき の巡回群
任意の奇数 m, n , gcd( m, n) 1に 対し ,
m n
( m 1)( n 1)/ 4
(1)
n m
1 mod n .
2m
・ 定理 2.3.2(XQRL)
/ n の
pS
算法4.3.1(Pepin,T.,1877)
● 入力 : m .
● 出力「: Fm P 」 ま たは「 Fm P 」
● 手順 :も し 3( Fm 1)/2 1 mod Fm なら 「 Fm P 」
と 判定し て終了. さ も なく ば「 Fm P 」 と 判定し て終了.
n Fm : 2 1 よ り
2m
S : { p P | p | n 1} {2}.
3( Fm 1)/2 1 mod Fm
m
22 1
3
( n 1)/2
3
1 mod n , 3
よ っ て n P b
を 満たす.
22
m
3n 1 1 mod n
s.t b n 1 1 mod n , b ( n 1)/ p 1 mod n p S
from amod import Amod as Amod
def Fm(m):
if m==0:
return '3 is Prime'
n=pow(2,pow(2,m))+1
if Amod(pow(3,(n-1)//2,n),n)==-1:
return '%d is Prime' %(n)
else:
return '%d is not Prime' %(n)
c.有限体の乗法群の利用
・ n P のと き
Fn
/ nに対し ,
Fn2 {a bx | a, b Fn , x は Fn 上既約二次多項式の解}
が考えら れ,
乗法群 Fn2
は位数 n 2 1 (n 1)(n 1) の巡回群なので,
位数が n 1 や n 1 の元を 持つ.
・ こ の事実と 線形回帰数列を 組み合わせて
n 1テ ス ト , n2 1テス ト , さ ら に理論的には
有限体テス ト と いう 広いアルゴ リ ズム も 考え ら れる .
•二の素べき乗-1(メルセンヌ数)の素数判定
● メ ルセン ヌ 数 M p : 2 p 1 n ( p P )
q を M p の素因子と する .
数列 u1 : 4, ui 1 : ui 2 2 (i )
y( q 1)/2 y( q 1)/2 0 mod q .
を 考える .
・ 2 3
n
: xn 3 yn , 2 3
n
w は 2 w q 1.
: xn 3 yn
n
n
1
xn
2 3 2 3
2
n
n
1
yn
2 3 2 3
2 3
xn m xn xm 3 yn ym , xn m xn xm 3 yn ym
yn m xn ym xm ym , yn m xn ym xm ym
こ れよ り x2 n 2 xn 1.
2
帰納法によ り , ui 2 x2i1 .
x
2 p 2
0 mod M p
yw 0 mod q と なる 最小の
yw 0 mod q ykw 0 mod q .
yn 0 mod q yn kw 0 mod q .
よ っ て n は w の倍数.
yn 0 mod q w | n
M p | x2 p2 , q | M p q | x2 p2 .
y2 p1 2 x2 p2 y2 p2 0 mod q
w 2 p 1.
2 2 p 1 q 1 M p 1 2 p
q M p M p P.
算法4.3.2(Lucas-Lehmer)
● 入力 : p P 2
● 出力 : 判定「 M p P 」 ま たは判定「 M p P 」
● 手順: も し u p 1 0 mod M p なら 「 M p P 」
と 判定し て終了. さ も なく ば「 M p P 」 と 判定し て終了.
※こ の数の重要性と 応用については, 最終の §7. 4参照.
そ こ で は p, M p P と なる こ と を 利用し た, 高性能な
擬似乱数生成法が紹介さ れている.
def Mp(p):
def u_t(t):
u=4
for i in range(1,t):
u=pow(u,2)-2
return u
Mp=pow(2,p)-1
if u_t(p-1)%Mp==0:
return '%d is Prime' %(Mp)
else:
return '%d is not Prime' %(Mp)
d.指標和の利用
・ 計算量が極めて多項式時間に近い( ln O(ln ln ln n ) n) ,
指数時間の PRIMES決定性アルゴ リ ズム で, その
アルゴ リ ズム は複雑になり ,実装の際に予見し ない
バグ を 含む可能性が高い.
・ 絶対擬素数テス ト
from gcd import gcd as gcd
import random
def APsPT(n,k):
kx=k
while k!=0:
b=random.choice(range(2,n-1))
if gcd(b,n)>1:
return '%d is not Prime' %(n)
elif pow(b,n-1,n)!=1:
return '%d is not Prime' %(n)
k=k-1
return(%d is APsP or %d is Prime( probability :1 2( k )))%(n, n, kx )
・ 平方剰余基準テス ト
from gcd import gcd as gcd
from amod import Amod as Amod
from xqrs import XQRS as XQRS
import random
def QRCT(n,k):
kx=k
while k!=0:
b=random.choice(range(2,n-1))
if gcd(b,n)>1:
return '%d is not Prime' %(n)
elif not Amod(pow(b,(n-1)//2),n)==XQRS(b,n):
return '%d is not Prime' %(n)
k=k-1
return%d is Prime( probability :1 2( %d ))%(n, kx )
・ 強擬素数テ ス ト
import random
from gcd import gcd as gcd
def SPsPT(n,k):
e=0
m=n-1
while 1:
if not m & 1:
e+=1
m=m//2
else:
break
kx=k
while k!=0:
else:
b=random.choice(range(2,n-1))
if gcd(b,n)>1:
return '%d is not Prime' %(n)
return '%d is not Prime' %(n)
k k 1
return%d is Prime( probability :1 4( %d ))%(n, kx)
© Copyright 2026 ExpyDoc