Transcript pptx - TNT
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)
こ れを利用する.し かし 制限があり , 条件を現実に計算可能な形に
言い直さ なければなら ない.
例えば, n P (n 1)! 1 mod n
し かし こ れは階上計算が指数時間 O(n)BC にな る.
こ こ で n 1 の素因数全体 S : { p P | p | n 1}
がわかる と き に注目し , (ⅱ) を次に言い替える .
● nP
b
≪参考≫
・ 定理2. 2. 4( ModPPw)
p P, e
g
/p
e 1
{g1 g /( p/21)p
※ (4.3) よ り bn1 1 mod n の計算量は O(lg2 n lglg n lglglg n).
こ の計算を各 p に対し 計算する ので, 一つの b に対する 計算量は
n :
#
( p 2ま たはe2)
/2
( p 2,e3)
e2
・ p43( 2. 11)
s.t bn1 1 mod n , b(n1)/ p 1 mod n p S … (ⅱ)
O( #S lg2 n lglg n lglglg n) #S lg2 n である.
s.t
e
/ n
1
n n1
p
pP
p|n
既約剰余類利用の問題点
● 問題①: ど う やって 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 : 22 1 n (m )
も し nP
( n 1)(31)/4 n
3
n
1
3 3 1 であ り ,
n
m
ま た n P 3
( n)
3
3
n 1
/ n に対し ,
3
m
22
1 mod n .
3
n P 3( n1)/2 mod n
n
2m
1 32
1
PR で (ⅱ) を 満た す.
n , a / n a ( n) 1 mod n
・ 定理2.3.2(XQRL)
任意の奇数 m, n ,gcd(m, n) 1に対し ,
m n
( m1)( n 1)/ 4
n m (1)
・ (ⅱ)
b
s.t
bn1 1 mod n , b( n1)/ p 1 mod n p S
mod n
つま り b 3 は位数 2 べき の巡回群
≪参考≫
・ 定理2.2.2
/ n の
算法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 よ り
S : { p P | p | n 1} {2}.
2m
3( Fm 1)/2 1 mod Fm
m
22 1
3
3
( n1)/2
1 mod n , 3
よ って n P b
を満たす.
m
22
3n1 1 mod n
s.t bn1 1 mod n , b( n1)/ 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
は位数 n2 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 )
を考える.
yw 0 mod q と なる 最小の
n
n
・ 2 3 : xn 3 yn , 2 3 : xn 3 yn
n
n
1
xn
2 3 2 3
2
n
n
1
yn
2 3 2 3
2 3
xnm xn xm 3 yn ym , xnm xn xm 3 yn ym
ynm xn ym xm ym , ynm xn ym xm ym
こ れよ り x2n 2xn 1.
帰納法によ り , ui 2x2i1 .
2
x 2 p2 0 mod M p
y( q1)/2 y( q1)/2 0 mod q .
w は 2w q 1.
yw 0 mod q ykw 0 mod q .
yn 0 mod q ynkw 0 mod q .
よ って n は w の倍数.
yn 0 mod q w | n
M p | x2 p2 , q | M p q | x2 p2 .
y2 p1 2x2 p2 y2 p2 0 mod q
w 2 p1.
2 2 p1 q 1 M p 1 2 p
q M p M p P.
算法4.3.2(Lucas-Lehmer)
● 入力: p P2
● 出力: 判定「 M p P」 ま たは判定「 M p P」
● 手順: も し u p1 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.指標和の利用
・ 計算量が極めて多項式時間に近い( lnO(lnlnln 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 APsPor %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:
b=random.choice(range(2,n-1))
if gcd(b,n)>1:
return '%d is not Prime' %(n)
else:
return '%d is not Prime' %(n)
k k 1
return%d is Prime( probability :1 4( %d ))%(n, kx)