数学

mod p^kにおける平方根

一つ前のエントリでは

x2=a(modp)

の解がわかると

x2=a(modp2)

を解くことが出来たのでした。同じ考え方で任意のpkについて次のようにして求めることが出来ます。

(xa)k
を計算して
aの係数が(modpk)で1になるように逆数を乗じればokです。

aの係数がpで割り切れてしまうとまずいのでそのことだけ証明しないといけませんが、結論だけから言うとその係数は
(2u)k1modpで等しくなります。つまりu2=a(modp)としたとき

(ukvka)=(ua)k
とすると

vk=(2u)k1(modp)
となります。よってvkpと互いに素で、逆数が存在することになり解を求めることが出来ます。
Posted by issei

カテゴリ : 数学

mod p^2における平方根

x2=a(modp)

の解がわかると

x2=a(modp2)

を解くことができます。その手順について解説します。

x2=a(modp)の解があるということは

x2a=up

なるuがあるということです。左辺は次のように変形することができます。

(xa)(x+a)=up

両辺を二乗すれば

(xa)2(x+a)2=u2p2
これより

((x2+a)2xa)((x2+a)+2xa)=u2p2

を得るので2xで各係数を割れば

 (x2+a2xa)(x2+a2x+a)=u2p24x2

となりx2+a2xが解になります。最後の2xで割るというところが微妙ですが、これはここからp2での剰余を考えて演算をするということで解決できます。


827=319
が既知とします。

(87)(8+7)=319(71167)(71+167)=32192

ここで
16x=1 (mod192)
なる数を探します。すると158であることがわかるので左辺の各項に乗じて192での剰余を求めると

(277)(27+7)=0(mod192)
を得ることができます。

注)
2xpと互いに素であることが重要です。xはあきらかにpと素ですが2を乗じているのでpは奇素数でなければなりません。
Posted by issei

カテゴリ : 数学

mod Pにおける平方根 その3

8N+1の素数について、もう一つ別の考え方を解説します。多分Tonelli–Shanksのアルゴリズムと同じ考えに基づくものと思われます。

p1=2st(ただしtは奇数)とおきます。すると任意のxに対して
(xt)2s=1
ですからxtは1の2t乗根です。

例えば97を考えると
96=253
ですから x3は1の32乗根です。一般的に1の32乗根は32個あり、そのうち16個が32乗してはじめて1になる数です。ある数ωが32乗して初めて1になる数とすれば
ω3,ω5,,ω31もまた32乗根してはじめて1になる数です。よって1つそのような数を見つければ他の数は自然と見つかることになります。

(余談ながらその逆数ω1,ω3,,ω31も然りです) 

ωを32乗して初めて1になる数(例えば42)としてその数を2乗、4乗としてこれを木の形にしてみます。(下図参照)

51024png

空白になっているところにも2の冪乗根があるはずですがそれは何かわからないので空欄にしておきます。また平方根についてはaが平方根の1つなら-aもまた平方根ですので剰余を0から95ではなく-48から47までの間になるように書いています。木の葉のほうから辿れば

42 → 18 → 33 → 22 → -1

です。この中にa3があれば答えは簡単です。例えばa47とすれば、a3=33ですから、1つ下の18を使って
a3=33=182
これより両辺にaをかけて
a4=182a
を得て
(a2181)2=a

が答えになります。18の逆数 (18x=1なる数)が出てきますがこれは普通に求めてもいいし、そもそも18161=27が逆数なのでそれを利用しても簡単に求まります。
答えとしては12が得られます。実際122=47です。

そうではない場合(例えば11)を探す場合は次のようにします。113=27です。27を冪冪で累乗していくと

(27)2=47(47)2=22
となり、ここで22が出ます。22はツリーのルートのすぐ右側にあるので、この数はツリーの右側にあることがわかります。ところでωですが次のような性質を持っています。

  • ω2を乗ずると2段目のノードに対して左右に移動する
  • ω4を乗ずると3段目のノードに対して左右に移動する

この性質を利用してω2(=18)を42に乗じて(-20になる)そのノードを右側のツリーの同じ場所におきます。そしてそこからまた冪冪でルートに戻っていきます。
このルートの中に求めるノードがあればそれが答えです。残念ながら今回もみつからないのでω4を乗じます。そうすると-27が無事見つかりました。これから答えが求まります。


71024png


最後に32乗してはじめて1になる数の見つけかたですが、これは平方非剰余な数を3乗すれば求めるものになります。平方非剰余な数は全体の半数ですからランダムに選んで(p1)/2乗して判定することができます。

この方法は運が悪いと沢山計算をする必要がありますが木の高さは sですから最悪でもs2くらいのオーダーの計算量になります。
一方葉は2sのオーダでこれを全部計算するのはsが大きくなるととんでもない数になります。sが小さいときは非効率ですが大きくなるにつれて優位性が増すと思われます。
Posted by issei

カテゴリ : 数学

mod Pにおける平方根 その2

一つ前のエントリで8N+1型以外の素数についての平方根の計算方法を解説しました。8N+1については同じような考えで求めようとしてもなかなかうまくいきません。
an=±a n
の形になかなか持ち込めないのがその要因です。今まで考えきた演算はpでの剰余をもって演算するもので代数学的にはFpで演算と呼ばれるものです。Fpp個の元からなる有限の集合で、その元同士に加減乗除が定義されているものです。この空間で演算をしている限りこの問題をクリアすのはどうも不可能なようです。そこで発想をちょっと変えてFpではなくFqで考えることにします。FqとはFpの世界で既約な方程式の根を追加した体(加減乗除がうまく定義された集合)です。Fpp個の元からなる体ですが、Fqq個の元からなるのでFqと表現します。今回はちなみにq=p2なので、Fp2と記述するのが正確なのかもしれませんが、とりあえずFqと表現しておきます。なんか難しいこと言ってますが発想としては簡単でFpでの平方根が存在しない数の平方根があると仮定してそれを追加したもの・・とゆるく考えておけばよいかと思います。

例えば有理数においても2の平方根は存在しませんが、仮にそれを2と書くとすれば
x+y2
という数の集合を考えることができてその集合に対して加減乗除が定義できます。例えば上記の数は二乗することが可能で二乗した結果は

(x2+2y2)+(2xy)2

であってその結果もまた x+y2の形に書けることがわかります。詳細は書きませんが割る場合も同様です。つまりx+y2の形の集合を考えれば全ての加減乗除はその内部で閉じておりまた完結していることになります。

Fqもそれと同じ原理を用います。Fpから平方非剰余の数をT1つ選びその平方根があると仮定してそれをTと表すことにし、この数をFpに追加します。この集合に対して加減乗除が成立するためには
x+yTと表すことができる数全てに対して加減乗除が閉じていることを示す必要がありますが証明は割愛します。xの選び方はp通りyの選び方はp通りですからこの体はp2個の元からなることになります。
 
q=p2
 
とします。するとこのFqに対してもフェルマーの小定理が成立して

xq=x

が成立することが知られています。つまりFqではq乗すると元に戻ります。ところでFpでは

xp=x

が成立しました。FpFqに含まれていると考えられますから、FqにおいてもFpに属する元ははその位置を変えません(固定される)。しかしFpに含まれない数はそうではなく、別な数に移動します。
この移動先は共役元になることが知られています。つまり
 
(x+yT)p=(xyT)
です。となればFqでは任意の元をp+1乗すると

(x+yT)p+1=(x+yT)(xyT)=x2y2T

となりその数がなんでありFpに属することになります。よって

x2y2T=a
となるようにうまくx,yを選ぶことができればp+1は偶数ですから

(x+yT)p+12

がその平方根になります。
 
仮にyを1として探してみます。このとき

T=x2a
が成立するのでxを適当に変えてみてその値からaを引いたもとのが非平方剰余である数をTとして選べば良いことになります。

例)
p=41とし8の平方根を考えます。xを色々変えて見ると、528=17は非平方剰余であることがわかります。よってF1681で考えることにより
(5+17)21
が答えになります。

実際計算をしてみると
(5+17)2=(1+1017)(5+17)4=(20+2017)(5+17)8=(25+2117)(5+17)16=(4+2517)
ですので
(5+17)16(5+17)4(5+17)1=34

となります。実際
 
\[
34^2=8\pmod{41}
\]
です。


余談)
Fpのような体を有限体(要素の数が有限なので)と言いますがその要素の数(位数とよぶ)は必ずpの冪であり、またpの冪の有限体は必ず存在することがわかっています。
Posted by issei

カテゴリ : 数学

mod Pにおける平方根

x2=a(modp)
を求めるアルゴリズムとその原理の紹介です。アルゴリズムについては
mod pでの平方根
に書いてあるものと基本的に同じです。
任意の素数pに対して

ap12=±1(modp)

が成立しその符号はaが平方剰余かどうかで決まります。今回二乗してaになる数を探すのでaは必ず平方剰余です。つまり上式の値は1です。この式の両辺にさらにaを乗ずると

ap+12=a(modp)

よってp+12が偶数なら

(ap+14)2=a(modp)

よって

ap+14
が解になります。これはp4N+3型の素数のときに使えます。簡単ですね。
 
例)
p=31として、2の平方根を求めてみる。
215=1(modp)
だから両辺に2を乗じて
216=2(modp)
を得る。よって28が平方根になる。実際に計算してみると
28=8(modp)であるから8が2の平方根である。実際82=2(modp)である。
 
そうではないとき(つまりp4N+1型の素数のとき)は次のように考えます。

ap14=±1(modp)

です。ここから両辺にaを乗ずると

ap+34=±a(modp)

よってp8N+5型の素数ならば

±(ap+38)2=a(modp)
符号が正の場合はap+38が解になります。

負の場合は4N+1型の素数は-1が平方剰余であるのであらかじめ1の根号(x2=-1となる数。仮にiと記述する)を求めておけば iap+38が解になります。

iは平方非剰余の数を(p1)/4すれば見つかります。1p1なる数のうち半数が平方剰余で半数が平方非剰余ですから2から順番に探索していけば高確率ですぐ見つかりますが8N+5型については2が常に平方非剰余ですので2(p1)/4をあらかじめ計算しておけば良いことになります。
 
例)
p=101として5の平方根を求める。
5(101+3)/8=56(modp)
である。よって56が平方根の可能性がある。実際計算をしてみると
562=5(modp)
であるから56が5の平方根である。
 
同じくp=101として6の平方根を求める。
6(101+3)/8=14(modp)
である。よって14が平方根の可能性がある。実際計算をしてみると
142=95=6(modp)
である。そこで二乗して-1になる数を探す。2からチェックをしていくと
225=10(modp)
である。実際
102=1(modp)
だから10は-1の平方根。これより
14×10=39(modp)
を得、39が6の平方根であることがわかる。

最後に残ったケース、p8N+1型の素数についてはちょっとややこしいので次のエントリーに書きます。
Posted by issei

カテゴリ : 数学

ピタゴラスの定理の証明

いろいろあるけれどこの証明が一番秀逸だと思います(それぞれの破片が合同であることは簡単にわかる)。
任意の正方形は5つの破片に切って分けて新しい二つの任意の正方形を作ることができるんですよね。その逆も然り。
path12763png
Posted by issei

カテゴリ : 数学

有限体の既約多項式の個数を求める

有限体の各次数における既約多項式の総数というのをここ暫く考えていました。まぁいろいろあるんですが、結論から言うと次の補題を証明した瞬間ほぼ終わりです。

pを素数とし、q=pnとする。有限体Fp上の多項式XqXdnの約数とするとd次の約数既約多項式全てを因子に持つ。

証明はそんなに難しくないのでまたの機会にでもここに書きます。とりあえず、例を上げます(例が多いブログなもので・・・)

例1)
F2上のX4Xの因数分解を考えます。n=2です。よって1次式と2次式の分解できます。実際計算してみると

X4X=X(X+1)(X2+X+1)

となります。この式はこれ以上分解するのは不可能です。

例2)
F2上の X8Xの因数分解を考えます。n=3です。
この式は3の約数である1次と3次の既約多項式を因子に持ちます。実際計算してみると


X8X=X(X1)(X6+X5++1)=X(X1)(X3+X+1)(X3+X2+1)

例3)
F2におけるX16Xの因数分解を考えます。n=4です。
よってnの約数である既約4次式、2次式、1次式を因子にもちます。実際計算してみると、

X16X=X(X1)(X2+X+1)(X12+X11++1)=X(X1)(X2+X+1)(X4+X+1)(X4+X3+1)(X4+X3+X2+X+1)

以上なんとなく感覚がつかめていただいたでしょうか?2の冪以外の例はまた別の機会にここに書きます。

さて、ここからFqにおけるn次の既約多項式の個数を求めます。

XqXにおいてn次の既約多項式の根を全て掛け合わせたものの次数をν(n)とします。先ほどの例で言えば

ν(1)=2ν(2)=2ν(3)=6ν(4)=12
です。この先ですが

ν(5)=30ν(6)=54

と続きます。

さて、Fqにはnの約数であるd次の既約多項式がすべて存在します。それらの次数を足し合わせれば当然qになります。よって、

d|nν(d)=q=pn

が成立します。ここからメビウスの反転公式を使って

ν(d)=d|nμ(nd)pd

となります。ν(d)/nn次式の個数になるので


1nd|nμ(nd)pd


が求める個数になります。

 

 

Posted by issei

カテゴリ : 数学

オイラーのφ関数

wikipediaより

オイラーのトーシェント関数(オイラーのトーシェントかんすう、英: Euler's totient function)は各正の整数 n に対して、1 から n までの自然数のうち n と互いに素なものの個数を φ(n) として与えることによって定まる数論的関数 φ である。慣例的に φ(n) と表記されるため、オイラーの φ 関数(ファイかんすう、phi function)とも呼ばれる。また、簡略的にオイラーの関数と呼ぶこともある。

計算方法概略

簡単にするためまずnの素因数分解をp1p2p3pnとし因子に平方数を含まないとします。 (つまり素数 p1,p2,p3,の羃は1)

1からnのうちp1の倍数の数が n/p1個あり、 p2の倍数が n/p2あり……ということでこれらの数をnから引きます。しかし、これでは p1p2など2つの素数の積の数を2回引いてしまうのでそれらを足します。しかし、これでは p1p2p3のような3つの素数の積になってる数を足しすぎてしまうのでそれらをまた引きます……と考えていけば……

ϕ(n)=n(n/p1+n/p2++n/pn)+(n/p1p2+n/p1p3++n/pn1pn)(n/p1p2p3+n/p1p2p4++n/pn2pn1pn)+ この式の分母の素数の積はnの全ての約数を渡ることは明かです。nの約数dを素因数分解したとき、それが偶数個ならn/dを足し、奇数個ならn/dを引いていくという流れになります。なお、上記の式は以下のように書けます。 ϕ(n)=n(11/p1)(11/p2)(11/p3)(11/pn)

ϕ(30)=30(30/2+30/3+30/5)+(30/6)+(30/10)+(30/15)30/30=8

平方数を含む場合ですが例えば 12のときを考えれば2の倍数を除去したときに12の因数である4の倍数は既に除去されています。つまり、平方因子をもつ約数は考慮しなくてもよいのです。(つまり、素因数が何種類あるか?が重要)これはそのまま一般に拡張出来ます。実際上記の式は nの素因数分解をp1e1p2e2p3e3pnenと分解される場合でも成立します。

n=p1e1p2e2p3e3pnenの素因数をそれぞれの項に配分していけば

ϕ(n)=p1e1p2e2pnen(11/p1)(11/p2)(11/p3)(11/pn)=(p1e1p1e11)(p2e2p2e21)(pnenpnen1)

なお、上記の式はメビウス関数を使えば ϕ(n)=d|nμ(d)nd とも表わすことができます。メビウス関数μ(n)

  • nが平方因数を含む場合はμ(n)=0
  • nが因数を偶数個含む場合はμ(n)=1
  • nが因数を奇数個含む場合はμ(n)=1
という関数です。

ここからメビウスの反転公式を使って

d|nϕ(d)=n とか即座に得られるのがまた味わい深いですの。

以上Mathjaxのリハビリでした

Posted by issei

カテゴリ : 数学

4n+1の素数を平方の和にする(その2)

相当前にエントリに書いた4n+1の素数を平方の和にするアルゴリズムですがガウス整数を使ったもっとスマートな解法を紹介します。

まず前回同様 p4n+1の素数として A2+1=0(modp) なるAを求めます。

A2+1=kp です。

左辺はガウス整数を使うとさらに因数分解できて (A+i)(Ai)=kp となります。

ここでガウス整数は通常の整数と同様、素因数分解等素数の性質があることを踏まえて等式を見てみます。

pはあきらかにA+iおよびAiを割きりません。ということはpはガウス整数の世界ではさらなる素数に分解できることを意味します。すなわち最大公約数(A+i,p)は1ではなく、x+iyの形をしたガウス整数となります。

(A+i,p)=x+iy ならば共役の関係から (Ai,p)=xiyがまた成立します。 一方(x+iy)(xiy)を考えるとこれは有理整数x2+y2となりこれはpを割り切らないといけませんが、 pは素数ですから結局これはpに等しくp=x2+y2となります。

つまりpA+iの最大公約数を求めればそこから解は自動的に求まることになります。

最大公約数はガウス整数の世界でもユークリッドの互除法で簡単に求めることができます。

例として、素数p=120710677を二つの和にしてみます

465055452+12=17916938×120710677

ですから最初は46505545+i120710677の最大公約数を求めればよいことになります。

A0=46505545+iB0=120710677 とします。

ノルムを比較すると|A0|<|B0|A0=3|B0|+... ですから最初の計算では A1=A0,B1=B03A0とすればよいことがわかります。 実際計算してみると A1=46505545+iB1=188059583i となります。以下同様にして計算していくと

A2=88936295i,B2=188059583iA3=88936295i,B3=101870013iA4=274671122i,B4=101870013iA5=274671122i,B5=79984+475iA6=34719+1303i,B6=79984+475iA7=34719+1303i,B7=10546+3081i ここでB7が求める答えになります。実際 105462+30812=120710677 です

注意

ユークリッドの互除法ではノルムの大きいほうをノルムの小さいほうで割ってその余りに置き換えるという手順を踏むのですが、それは以下のようにして求めます。

a+ibc+idで割る場合は a+ibc+id=(a+ib)(cid)c2+d2=ac+bdc2+d2+bcadc2+d2i ここで、有理数 ac+bdc2+d2,bcadc2+d2に最も近い整数をn, mとすれば (a+ib)=(n+im)(c+id)+(r+is) と書いたときに、r+isのノルムはc+idより小さくなります。よってr+isを余りとみなして計算を進めていくことができます。

別の考察

この例では(A+i,p)を考えましたが、(A+i,k)を考えても同様に計算をすることができることがわかります。

この場合最大公約数を求めなくても以下のように計算をすることができます。

a2+b2=0(modk) であることを考えると a=a(modk),b=b(modk)とおけば a2+b2=0(modk) もまた成立します。つまりa2+b2kを割りきります。つまり (a+ib)(aib)(a+ib)(aib)=ka2+b2p=kp が成立します。右辺は整数ですから左辺は共役なガウス整数の積にならなければなりません。 よって a+iba+iba+ibaib のどちらかがガウス整数になります。ここで k/2<a<k/2k/2<b<k/2 なるように a', b'を選べば kより小さい k'が見つかることになります。 この手順を繰替えせば kより始めていつかは1になるので求める解を見付けることができます。

これが前回解説したアルゴリズムと同じものになります。

さらりと流した部分の補足

有理整数がガウス整数の積で表わされる必要条件は共役の因子を含むことである。

ガウス整数をそれぞれ a+ibc+idとする。c0, d0, (a,b)=1,(c,d)=1と仮定して問題ない。 なぜならもし(a,b)=k>1ならばa=a/k,b=b/kとして k(a+ib)(c+id)を考えればよいからである。 (a+ib)(c+id)=(acbd)+i(ad+bc) が有理整数なのだからad+bc=0すなわち ad=bcが成立する。 よって、abと互いに素だからcdを割り切りかつdcを割きらなければならないが、 これは c=dまたはc=dを意味する。c=dとすればa=bでありc=dとすれば a=bである。 いずれにしても共役の因子を含まなくてはならない。

有理整数が共役の数の積で表わされているのなら、その数はガウス整数でなければならない。

a/bおよびc/dを考える。(a,b)=1,(c,d)=1と仮定して問題ない (ab+icd)(abicd)=a2c2b2d2 から b2d2=1 これはb=±1,d=±1を意味する。

Posted by issei

カテゴリ : 数学

x^2 = a (mod P)を効率よく解く

有限体Fp上で

x^2 = a

を解くことを考えます。根があるかないかは平方剰余の相互法則
 

x^2 = aが Fp根を持つ
<=>
(a/p) = 1 (ルジャンドルの記号)
<=>
a^(p-1)/2 = 1

で簡単に分かるのですが具体的にxが何であるかを求めるにはどうしたらよいのでしょうか?

Fpは有限群なので全ての元について根かどうかを解けばよいのですが、この手法はpが大きくなると破綻するのは自明です。そこで、ここでは別のアプローチを紹介します。

以下 aはFpで平方剰余であると仮定しておきます。また実数の世界にあやかって、x^2=aなるxを√aと表すことにします。(このようなxは2つ存在しもう一方は-√aです)。

pが4n+3型の素数のとき

pが4n+3ならば話は簡単です。

aは平方剰余なので

a^(p-1)/2 = 1

です。この両辺にaをさらに掛ければ

a^(p+1)/2 = a

となります。しかし、(p+1)/2は偶数ですから

a^(p+1)/4 = √a

ゆえに a^(p+1)/4が根(のうちの1つ)です。

pが4n+1型の素数のとき

この場合(p-1)/2が偶数のため(p+1)/2が奇数となり上の手法は使うことができません。ならば(p-1)が奇数になるまで 2で割るのはどうでしょうか?すなわち

p-1 = 2^k * s

とし、a^s乗を考えるのです。このa^s はあと2^k乗すれば 1になるのですから1の2^k乗根です。このa^sは原始的かどうか(すなわち 2^k乗根して始めて1になるかどうか)はわかりません。しかし仮に1つ原始2^k乗根を知っているとすれば全ての2^k乗根は

1, r, r^2, r^3, ..., r^(2^k-1)

とかけます。このようなrはこちらの手法で試行錯誤的に(だが簡単に)見つけることができます。さらに aは平方剰余だということがわかっているので実際は偶数番目だけのどれかであり、

a^s  = r^2n 

と書けます。このnが何かは今はわかりません。(この手法では最後までこのnが何かはわかりません)。しかし、nが何であるかわからなくても r^2n * r^2m=1となるようなmを見つけることができます。それには次の性質を利用します。

x, y が原始N乗根ならば x * y は原始N/2乗根である。


つまり原始128乗根どうしを掛け合わせると原始64乗根になるということです。ある数が原始何乗根かどうかはその数を自乗していき-1になる冪を調べればわかります。以下例で説明したほうがわかりやすいと思いますので例で解説します。

p=769 , a=8として  x^2 = a を解くとします。p-1=768 = 3 * 2^8 ですからF769には原始256乗根が存在し、試行錯誤法で計算するとr=7であることがわかります。

a^3 = 8^3 = 512

です。512は

512^64 = -1

ですから、原始128乗根の1つ、すなわち

1, 7^2, 7^4, ... 7^254

のうちのどれかです。

そこで原始128乗根である 7^2 = 49 をかけることにより原始64乗根(もしくはそれ以上)にすることができます。実際かけてみると

8^3 * 7^2 = 480

となり480は

480^32 = -1

ですから、原始64乗根です。そこで原始64乗根である 7^4 を両辺にかけます

8^3 * 7^2 * 7^4 = 518

518は同様の計算で原始32乗根ですから 7^8を両辺にかけます。

8^3 * 7^2 * 7^4 * 7^8 = 729

729は原始8乗根です(原始16乗根をすっとばして2段階あがった)ので、両辺に7^32をかけます

8^3 * 7^2 * 7^4 * 7^8 * 7^32 = 707

707は原始4乗根ですから両辺に7^64をかけます。

8^3 * 7^2 * 7^4 * 7^8 * 7^32 * 7^64 = 1

ここで始めて1となりました。両辺に8をかけると

8 * 8^3 * 7^2 * 7^4 * 7^8 * 7^32 * 7^64 = 8

となり左辺の指数はすべて偶数です。故に

8^2 * 7 * 7^2 * 7^4 * 7^16 * 7^32 = √8

となります。左辺を計算してみると503になります。たしかに

503^2 = 8

です。

 

Posted by issei

カテゴリ : 数学