2012-07-12 4 views
2

C/C++에서 (a^b)%m은 어떻게 계산합니까? b은 64 비트에 맞지 않습니다. 즉, b 대신 b%m을 사용하여 위의 값을 계산하는 방법이 있습니까?모듈러 지수화

그리고 O(log(b)) 시간 또는 O(log(b%m)) 시간에 위의 결과를 계산할 수있는 알고리즘이 있습니까? Euler's theorem에 따르면

+1

이것은 수학 문제와 더 비슷합니다. –

+1

시도해보십시오. http://math.stackexchange.com/ –

+0

b가 64 비트에 맞지 않는 곳을 의미합니까? 일반적인 지수 알고리즘은 b의 다음 비트가 설정되고 제곱 된 경우 a를 곱하여 결과를 누적시킵니다. 이것은 큰 b에 대해 꽤 쉬운 것처럼 보입니다. 그것은 크고 작습니다. – tbroberg

답변

8

, am가 서로 소 경우 :

ab mod m = ab mod phi(m) mod m

그렇게 b가 큰 경우, 당신은 b 대신 값 b % phi(m)을 사용할 수 있습니다. phi(m)Euler's totient function이며, 소수 분해가 m 인 경우 쉽게 계산할 수 있습니다.

이렇게 b의 값을 줄이면 Exponentiation by squaring을 사용하여 모듈러 지수를 O(log (b % phi(m)))으로 계산하십시오.

+0

to nit-pick : a와 m이 서로 다른 경우에만 true입니다. – Henrik

+0

@Henrik : m이 소수이고 a sabari

+0

@Henrik : 맞아, 그걸 깜빡 했어, 고마워. 사바리 : 그래, 그 경우에 작동합니다. – interjay

관련 문제