素数大富豪関連でのPARI/GP使用例メモ

・公式(英語):https://pari.math.u-bordeaux.fr/doc.html
・リファレンスカード(英語):https://math.mit.edu/~brubaker/PARI/PARIrefcard.pdf

適当に思いついたことのメモ
・古典的なプログラミング言語と違って添え字は1から始まる
・引数はいわゆる値渡し
・コンマとセミコロンの使い方に注意
・factor(x)の返り値をsとすると、x = Πs[i,1]^s[i,2], iの上限は#s[,1]とかで得られる
・すべての並べ替えをループするforpermという便利な構文がある
・%で直前の結果を参照、%4で例えば4番目の出力を参照できる

メリット
・大きい整数が直接使える
・素数判定や素因数分解を含めた強力な組み込み関数がある
・Androidで動くアプリがある

欠点
・(特に日本語の)情報が少ない
・(慣れないと)デバッグは簡単ではない
・たぶん全角文字は対応していない


ketasu(x)={local(k);k=1;while(x>=10,x=floor(x/10);k++);return(k);}; tunagu(A)={local(x);x=0;for(j=1,#A,x=x*10^(ketasu(A[j]))+A[j]);return(x);}; /* リストAの中身をつなげた整数を返す */ barasu1(x,A) ={while(x!=0,x1=x%10;listput(A,x1);x=(x-x1)/10);return(A);}; /* 1つの整数xから各桁のリストを、リストAに追加する*/ qbaisagasu(q,B)={forperm(B,p,for(k=1,#p-1,x=tunagu(p[1..k]);y=tunagu(p[k+1..#p]);if(x*q==y,if(isprime(x),print([x,y]);return(1)))));return(0);}; /* Bを2つに分けてpとqpにできるか探す。例えばqbaisagasu(2,[6,4,3,2])で[23,46]を返す */ soin_mata_gouseisuu_1(x)={local(A,s,Q,p,q);A=List();s=factor(x);Q=s[1,1]^s[1,2];for(j=2,#s[,1],p=s[j,1];q=s[j,2];A=barasu1(p,A);if(q>1,A=barasu1(q,A)));r=qbaisagasu(Q,Vec(A));if(r>0,print([x,s]));return(r)}; /* xの素因数分解の最初に現れるp^qをQとして、xの素因数分解の素材でQp型の合成数出しを探す */ for(a=1,999,soin_mata_gouseisuu_1(a*10^4+1312)) /* 適当な範囲で試しに実行 */ (自分の環境ではしばらく待つと) 3qkq = 2^5*t3*947, 2^5*97=3t4 978kq = 2^6*152833, 83*2^6=5312 が見つかった。 (しかしこの程度の範囲でしばらく待つので、より広い本格的な探索には改善が必要だろう) 2023/06/19 メモ程度に
素数大富豪TOP
inserted by FC2 system