2014-05-09 3 views
0

Montgomery multiplication의 구현을 파이썬으로 작성하려고합니다. 파이썬에서 GMP의 mpz_getlimbn()과 동등한 내용이 필요하지만, 내 삶 에선 찾을 수없는 것 같습니다.Python에서 Python을 길게 늘리십시오.

도움을 주시면 감사하겠습니다.

편집

내가 구현 한 다음 그러나 나는 GMP 발생하지 않는 사지에 대한 범위 부족 오류가 인덱스를 얻을.

def unpack(x, b): 
    if gmpy2: 
     return [long(x) for x in gmpy2.unpack(gmpy2.mpz(x), b)] 

    b = 2 ** b 
    r = [] 
    while x: 
     x, temp = divmod(x, b) 
     r.append(temp) 
    return r 
+0

이것은 공개 API의 일부가 아닙니다. 도달해야 할 구현 세부 사항은 http://hg.python.org/cpython/file/db842f730432/Include/longintrepr.h를 참조하십시오. – user2357112

+0

@ user2357112 답장을 보내 주셔서 감사합니다. Cython을 사용하지 않고이 문제를 해결할 방법이 있습니까? 아니면 유일한 경로입니까? – Prydie

+0

여기에서 사용할 적절한 도구인지 Cython에 대해 충분히 알지 못합니다. 나는 C를 직접 쓰는 관점에서 생각하고 있었다. – user2357112

답변

1

고객님의 unpack()이 수정되어 저에게 적합합니다. 그래도 오류가 발생하면 전체 오류를 게시하십시오.

>>> import gmpy2 
>>> 
>>> def unpack(x, b): 
...  try: 
...   return [x for x in gmpy2.unpack(gmpy2.mpz(x), b)] 
...  except NameError: 
...   b = 2 ** b 
...   r = [] 
...   while x: 
...    x, temp = divmod(x, b) 
...    r.append(temp) 
...   return r 
... 
>>> unpack(123456**7, 15) 
[mpz(0), mpz(0), mpz(4096), mpz(25855), mpz(24508), mpz(31925), mpz(15111), mpz(10775)] 
>>> del(gmpy2) 
>>> unpack(123456**7, 15) 
[0, 0, 4096, 25855, 24508, 31925, 15111, 10775] 

gmpy2를 사용

, 나는 gmpy2가 사용 된 것을 보여주기 위해 mpz로 결과를 떠났다.

파이썬의 긴 정수형은 15 비트 또는 30 비트를 저장하는 팔다리를 사용합니다. sys.int_info은 해당 시스템의 특성을 제공합니다.

동의어, 나는 gmpy2을 유지하며 누군가 unpack()을 사용하는 것이 좋습니다.

+0

답장을 보내 주신 모든 분들께 감사드립니다. 'mpz_getlimbn()'에 대한 문서에서는 "가장 중요한 사지는 숫자 0입니다"라고 나와 있는데,이 기능을 올바르게 구현하려면 압축을 풀어야 출력을 뒤집어 야합니다. – Prydie

+0

실은 지금 내 단위 테스트가 압축을 풀지 않고 취소하는 것 같아 취소합니다. – Prydie

관련 문제