티스토리 뷰

카테고리 없음

오일러 파이 함수

makesource 2016. 9. 23. 15:28

오일러 파이 함수란

 = 1부터 n까지의 양의 정수 중에 n과 서로소인 것의 개수를 나타내는 함수이다

로 정의되는 함수이다.


이러한 파이 함수에는 여러가지 성질이 발견되는데

우선 곱의 함수라는 점이다.

이에 대한 증명은 에라토스테네스의 채와 비슷하게 정수들을 쭉 나열한 다음, 서로소가 아닌 수들을 지워나가면 규칙을 찾을 수 있다.


이러한 파이 함수의 값을 구하는 방법에는 여려가지가 있겠지만,

우선 특정 N에 대해 구한다고 생각하면

N의 소인수들을 다 구한 다음  이 공식을 사용하면 된다.


1~ 까지 파이 함수의 값을 구하기 위해서는,

소수판별을 할때 에라토스테네스의 채 기법을 사용한다.


pi[i] = i;

for (int i=2;i<=N;i++) {

if (pi[i] == i)  { // 소수인 경우

pi[i] = i - 1;

for (int j=i+i;j<=N;j+=i) pi[j] = pi[j] * (i-1) / i;

}

}

와 같이 구할 수 있다.

시간복잡도는 n lg lg n이다.


이러한 파이 함수와 관련된 법칙이 있는데, 바로 오일러의 정리이다.

만약 a와 n이 서로소이고 n이 자연수이면 다음이 성립한다.


특히 n이 소수일때는 pi(n) = n-1 이기때문에 페르마 소정리 a^(p-1) = 1 (mod p)가 성립한다.

이를 통해서 서로소인 a와 n에 대해 모듈러 inverse을 계산 할 수 있다.


서로소인 a와 n에 대해 모듈러 인버스를 다른 방식으로 계산 할 수 있는 방법도 있는데, 이는 확장유클리드 알고리즘을 이용한 방식이다.

확장 유클리드란

ax + by = gcd(a,b)를 만족하는 정수해 x,y 를 찾기 위한 알고리즘으로 


이를 위의 식에 적용시키면

a*x + n*y = gcd(a, n) = 1 을 만족시키는 정수해를 찾을 수 있고

양변을 모듈러 n연산을 씌우면

a*x = 1 (mod n)이라는 식이 만들어 진다.

여기서 x는 법 n에 대해 a의 곱셈에대한 역원이 된다.



임의의 수 N에 대해 pi를 구하는 방법


imsi = N;

for (j=2;j*j<=imsi;j++) if (imsi % j == 0) {

while(!(imsi %j)) imsi /= j;

pi = pi / j * (j-1)

}

if (imsi > 1) { // 소수

pi = pi / imsi * (imsi - 1)

}


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함