계산 모듈러 역


16

두 양수를 감안할 xn함께는 x<2^n, 계산에 짧은 함수를 작성합니다 x^-1 mod 2^n. 즉, 찾을 y그러한x*y=1 mod 2^n .

당신의 기능은 최소한 적당한 시간 안에 완료되어야합니다 n=64 하므로 철저한 검색이 작동하지 않습니다.

역이 존재하지 않으면 호출자에게 어떻게 든 표시해야합니다 (예외 발생, 센티넬 값 반환 등).

어디서부터 시작해야할지 궁금하다면 Extended Euclidean Algorithm을 사용해보십시오 .


이것은 일부 수학 소프트웨어에서 하나의 진술이 될 것입니다
st0le

1
@ st0le : 그렇습니다. 그런 시스템에서는 그러한 기능을 사용할 수 없습니다. :-D
Chris Jester-Young

답변:


2

파이썬 95 89

c당신의 기능입니다. 역수가없는 경우 (즉, x가 짝수 인 경우) 0을 반환합니다.

p=lambda x,y,m:y and p(x,y/2,m)**2*x**(y&1)%m or 1
c=lambda x,n:[0,p(x,2**n-1,2**n)][x%2]

3

파이썬, 29 바이트

lambda x,n:pow(x,2**n-1,2**n)

이것은 짝수 x에 대해 0을 반환합니다 . 그것은 Euler의 정리를 사용하며, 2 ^ n -1은 파이썬의 내장 빠른 모듈 식 지수를 통해 2 ^ ( n -1) -1로 나눌 수 있다는 것을 관찰했습니다 . 이것은 n 까지 7,000 정도 까지 충분히 빠르며 약 1 초 이상 걸리기 시작합니다.


2

매스 매 티카-22

f=PowerMod[#,-1,2^#2]&

f[x,n]반환 yx*y=1 mod 2^n달리,x is not invertible modulo 2^n


2

GolfScript (23 자)

{:^((1${\.**2^?%}+*}:f;

존재하지 않는 역수에 대한 센티넬 결과는 0입니다.

xφ(2n)1(mod2n)x1x2n11(mod2n)

x2k1=(x2k11)2×xk=1

{1\:^(@{\.**2^?%}+*}:f;

이나 k=2

{:^((1${\.**2^?%}+*}:f;

다른 접근 방식을 사용하고 있지만 센티넬이 더 어렵습니다.

xy1(mod2k1)xy{1,1+2k1}(mod2k)xx(y+xy1)1(mod2k)y=(x+1)y1

부터0x1(mod20)

x(1(x+1)nx)1(mod2n)

x+1

그것은 19 문자 기능을 제공합니다

{1$)1$?@/~)2@?%}:f;

xx&11

{1$.1&+1$?@/~)2@?%}:f;

이것은 의 센티넬 값을주는 것으로 보입니다.02n1 아직 입증하지 못했습니다.

한 걸음 더 나아가서 의 센티넬을 보장 할 수 있습니다.01(x+1)n11:

{1$.1&*)1$?@/~)2@?%}:f;

그것은 코드 길이에 대한 오일러 정리의 직접적인 적용과 관련이 있지만, 큰 경우 성능이 떨어질 것입니다 . 다른 방법으로 인수를 취 n x f하면 한 문자를 저장하고 22 문자를 얻을 수 있습니다 .

{..1&*)2$?\/~)2@?%}:f;

1

루비-88 자

기능을 사용하십시오 f.

def e a,b;a%b==0?[0,1]:(x,y=e(b,a%b);[y,x-(y*(a/b))])end
def f x,n;e(x,2**n)[0]*(x%2)end

연결된 위키 페이지의 재귀 함수는 오류시 0을 반환합니다.


e :를 인라인하여 일부 문자를 저장할 수 있습니다 (e=->a,b{...})[x,2**n][0]. a%b<1대신 테스트하여 문자를 저장할 수도 있습니다 a%b==0.
histocrat


1

Pyth , 9 바이트

.^Et^2Q^2

여기 사용해보십시오!

입력을 역순으로 취합니다. 또는 9 바이트도 : .^EtK^2QK.

설명

. ^ Et ^ 2Q ^ 2-전체 프로그램.

. ^-펑 기능. 파이썬 (pow)에서도 마찬가지입니다.
  E-두 번째 입력
    ^ 2Q-그리고 2 ^ 첫 번째 입력.
   t-감소합니다.
       ^ 2-그리고 2 ^ 첫 번째 입력.

0

간격, 39 바이트

f:=function(x,n)return 1/x mod 2^n;end;

f(x,n)x모듈로 의 역수를 반환하고 2^n오류 메시지를 표시합니다

Error, ModRat: for <r>/<s> mod <n>, <s>/gcd(<r>,<s>) and <n> must be coprime

역이 존재하지 않는 경우.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.