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 2024 ExpyDoc