2016-11-22 7 views
0

과 같은 4 개의 큰 숫자 (최대 100 자리)가 m, y, n, r입니다. m,nr의 값을 알고 있으며 y 값을 찾고 싶습니다. 이 작업을 수행하려면 python3에 기능이 있습니까? 문제의 r의 값이 1이 보장되면python3에서 특정 mod를 계산하는 함수

+1

'(m * y) mod n = (m mod n) * (y mod n) mod n' 속성을 사용할 수 없습니까? – Rojan

+0

당신이 묻는 것은 'powmod'와는 다르다. 모듈 식 산술로 나누기를 요구하고 있습니다. 일반적으로 [확장 된 유클리드 알고리즘] (https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm)을 사용합니다. 이 방법은 구현하기가 쉽지만 오류 조건을주의 깊게 확인해야합니다. –

+0

나는이 함수가 필요한 예제를 말하고있다. @RoryDaulton – Richard

답변

0

(gmpy2powmod 기능 등), 같은 gmpy 또는 gmpy2 모듈의 invert 기능을 일부 사용할 수 파이썬 기능이있다. 나는 당신이 원하는보다 일반적인 분수 함수를 찾지 못했습니다. 표준 반전 함수를 사용할 수는 있지만 실제로 수행 할 수있는 일부 분할을 허용하지 않습니다.

여기 내가 방금 작성한 기능이 sample code in Wikipedia에 기반하여 효율적으로 작성되었습니다. 전문 용어로 divideresidues(r, m, n)으로 전화하십시오.

def divideresidues(dividend, divisor, modulus): 
    """Return the dividend/divisor modulo modulus""" 
    r, newr = modulus, divisor 
    t, newt = 0, 1 
    while newr != 0: 
     quotient, remainder = divmod(r, newr) 
     r, newr = newr, remainder 
     t, newt = newt, t - quotient * newt 
    if t < 0: 
     t = t + modulus 
    quotient, remainder = divmod(dividend, r) 
    if remainder: 
     raise ValueError('Bad division in divideresidues()') 
    return t * quotient % modulus 

이 유클리드 알고리즘, divisormodulus의 작은 자릿수, 즉 다섯 번 수와 동일 효율을 가지고있다. dividend의 크기는 기본적으로 부적합합니다. 귀하의 경우에는 최대 500 단계를 의미합니다. 이것은 큰 숫자처럼 들리지만 큰 숫자로 테스트 해 보았을 때 충분히 빠르며, 500 단계는 거의 발생하지 않습니다. 기본적으로 divisormodulus이 피보나치 시퀀스의 연속 숫자 일 때입니다.