logo

정수론에서의 위수 📂정수론

정수론에서의 위수

정의 1

gcd(a,p)=1\gcd (a, p) = 1 이라고 하자. ae1(modp)a^{e} \equiv 1 \pmod{p} 를 만족하는 가장 작은 자연수 eeordp(a)\text{ord}_{p} (a) 라 쓰고 법 pp 에서 aa위수order라 정의한다.

정리

an1(modp)a^{n} \equiv 1 \pmod{p} 이라고 하면 ordp(a)n\text{ord}_{p} (a) \mid n 이다.

설명

예를 들어 p=7p=7 을 생각해보면 111(mod7)231(mod7)361(mod7)431(mod7)561(mod7)621(mod7) \begin{align*} 1^{1} \equiv & 1 \pmod{ 7 } \\ 2^{3} \equiv & 1 \pmod{ 7 } \\ 3^{6} \equiv & 1 \pmod{ 7 } \\ 4^{3} \equiv & 1 \pmod{ 7 } \\ 5^{6} \equiv & 1 \pmod{ 7 } \\ 6^{2} \equiv & 1 \pmod{ 7 } \end{align*} 이다. 여기서 66 의 위수는 222,42, 4 의 위수는 33 이고 3,53,5 의 위수는 66 이다.

위의 정리에서 특히 n=p1n=p-1 이라고 두면 2,3,62,3,6p1=6p-1= 6 을 나눈다는 사실을 쉽게 확인할 수 있다. 또한 페르마의 소정리에 따르면 소수 pp 에 대해 항상 ap11(modp)a^{p-1} \equiv 1 \pmod{p} 이므로 ordp(a)(p1)\text{ord}_{p} (a) \mid (p-1) 임을 알 수 있다.

증명

G:=gcd(ordp(a),n)G := \gcd ( \text{ord}_{p} (a) , n ) 이라고 두면 G=ordp(a)s+ntG = \text{ord}_{p}(a) \cdot s + n \cdot t 를 만족하는 s,ts,t 가 존재한다.

위수의 정의와 가정에 의해 aG=aordp(a)s+nt=(aordp(a))s(an)t11(modp) a^{G} = a^{ \text{ord}_{p}(a) \cdot s + n \cdot t} = \left( a^{ \text{ord}_{p}(a) } \right)^s \cdot \left( a^{n} \right)^{t} \equiv 1 \cdot 1 \pmod{p} 이다. ordp(a)\text{ord}_{p}(a)ae1(modp)a^{e} \equiv 1 \pmod{p} 를 만족시키는 가장 작은 자연수 ee 로 정의되었으므로 Gordp(a)G \ge \text{ord}_{p}(a)따라서 G=ordp(a)G = \text{ord}_{p}(a) 이고, ordp(a)p\text{ord}_{p}(a) \mid 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) #Calculate a order of g in modulo p
{
  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)

다음은 위의 코드를 실행시킨 결과다.

20190227\_095435.png


  1. Silverman. (2012). A Friendly Introduction to Number Theory (4th Edition): p211. ↩︎