数論における位数
📂整数論数論における位数
定義
定理
an≡1(modp) とすると、ordp(a)∣n である。
説明
例えば、p=7 を考える。
11≡23≡36≡43≡56≡62≡1(mod7)1(mod7)1(mod7)1(mod7)1(mod7)1(mod7)
ここで、6 の位数は 2 であり、2,4 の位数は 3 で、3,5 の位数は 6 である。
上の定理では、とくに n=p−1 とすると、2,3,6 が p−1=6 を割ることを容易に確認できる。また、フェルマーの小定理によれば、素数 p に対して常に ap−1≡1(modp) が成り立つので、ordp(a)∣(p−1) であることがわかる。
証明
G:=gcd(ordp(a),n) とすると、G=ordp(a)⋅s+n⋅t を満たす s,t が存在する。
位数の定義と仮定により、
aG=aordp(a)⋅s+n⋅t=(aordp(a))s⋅(an)t≡1⋅1(modp)
ordp(a) は ae≡1(modp) を満たす最小の自然数 e として定義されたので、G=ordp(a) であり、ordp(a)∣p である。
■
コード
以下は、R言語で位数を計算するためのコードである。素因数分解のコードが使われた。
prime = read.table("../attachment
/cfile8.uf@25411C3C5968BBE322F0D4.txt"); prime = prime[,1]
factorize<-function(p)
{
q=p
factors<-numeric(0)
i=1; j=1
while(q!=1)
{
if(q%%prime[i]) {i=i+1}
else
{
q<-q/prime[i]
factors[j]<-prime[i]
i=1
j=j+1
}
}
return(factors)
}
order<-function(g,p,h=1)
{
qe<-table(factorize(p-1))
qe<-rbind(as.numeric(names(qe)),qe)
divisor<-qe[1,1]^(0:qe[2,1])
if((length(qe)/2)==1) {return(qe[1,1]^qe[2,1])}
for(i in 2:(length(qe)/2)) {divisor=c(divisor%*%t(qe[1,i]^(0:qe[2,i])))}
for(i in divisor) {if((FPM(g,i,p))%%p==1) break;}
return(i)
}
order(1,7)
order(2,7)
order(3,7)
order(4,7)
order(5,7)
order(6,7)
以下は上記のコードを実行した結果である。
