베즈 아웃의 정체성


11

베즈 아웃의 정체성 소개

두 정수 A, B의 GCD는 나머지를 남기지 않고 둘을 나누는 가장 큰 양의 정수입니다. 유클리드의 속성으로 인해 각 정수 N은 다음과 같이 다른 정수 M으로 나눌 수 있습니다.

                                           유클리드 사업부

우리가 쓸 수 있도록 쌍 u, v가 존재합니다.

                                           베즈 아웃의 정체성

그 쌍은 무한정이므로 특별한 것을 찾고 싶습니다. 실제로는 두 개의 그러한 쌍이 정확히 (A, B가 0이 아님) 있습니다.

                                           의미있는 (u, v) 쌍에 대한 제약


예 :                                    19와 17의 예


도전

이 과제의 목표는 위의 제약 조건을 만족시키고 u가 양수 여야하는 (순서대로) 계수 (u, v) 쌍을 찾는 것입니다. 이것은 출력을 고유 한 쌍으로 좁 힙니다.


입력

입력이 양수라고 가정 할 수도 있고 A도 항상 B보다 큽니다 (A> B).


산출

프로그램 / 기능의 출력은 챌린지에 지정된 (순서대로) 쌍이어야합니다.


규칙

내장 된 확장 유클리드 알고리즘을 사용해서는 안됩니다 (예 : Mathematica에서는 사용할 수 GCD있지만 사용 하지 않아야합니다 ExtendedGCD-어쨌든 5,3에서는 실패합니다).

정답은 전체 프로그램 (STDIN 또는 이와 유사한 입력 및 STDOUT을 통한 출력) 또는 기능 (페어 반환) 일 수 있습니다.

쌍 (u, v) 외에는 출력이 없어야하며 후행 줄 바꿈이나 공백이 허용됩니다. (대괄호 또는 쉼표는 괜찮습니다)

이것은 코드 골프이며 모든 표준 허점은 금지되어 있으며 바이트 수가 가장 적은 프로그램이 승리합니다.


(A, B) -> (u, v)
(42, 12) -> (1, -3)
(4096, 84) -> (4, -195)
(5, 3) -> (2, -3)
(1155, 405) -> (20, -57)
(37377, 5204) -> (4365, -31351)
(7792, 7743) -> (7585, -7633)
(38884, 2737) -> (1707, -24251)
(6839, 746) -> (561, -5143)
(41908, 7228) -> (1104, -6401)
(27998, 6461) -> (3, -13)
(23780, 177) -> (20, -2687)
(11235813, 112358) -> (8643, -864301)

답변:


1

MATL , 37 40 바이트

ZdXK2Gw/:1G*1GK/t_w2$:XI2G*!+K=2#fIb)

이 문제보다 빠른 릴리스 (9.3.1)를 사용합니다 .

이것은 무차별 접근 방식이므로 큰 입력에 대해서는 작동하지 않을 수 있습니다.

온라인으로 사용해보십시오! 온라인 컴파일러는 최신 릴리스를 기반으로하지만 동일한 결과를 생성합니다.

설명

Zd            % implicitly input A and B. Compute their GCD. Call that C
XK            % copy C to clipboard K
2Gw/:         % vector [1, 2, ..., B/C]
1G*           % multiply that vector by A
1GK/t_w2$:    % vector [-A/C, -A/C+1 ..., A/C]
XI            % copy to clipboard I
2G*           % multiply that vector by B
!+            % all pairwise sums of elements from those vectors
K=2#f         % find row and column indices of sum that equals C
Ib)           % index second vector with column (indexing first vector with
              % row is not needed, because that vector is of the form [1, 2, ...])

7

하스켈, 51 바이트

a#b=[(u,-v)|v<-[1..],u<-[1..v],gcd a b==u*a-v*b]!!0

사용 예 : 27998 # 6461-> (3,-13).

이 모든 조합을 발견 짐승 힘 접근 방식 uv발주 유효 솔루션입니다 그 u첫 번째 하나를 선택합니다. 큰 시간이 걸립니다 |v|.


나는 []!!0아이디어를 좋아한다 =)
flawr

3

파이썬 3 101 106 바이트

편집 : Bruce_Forte가 제안한 개선 사항과 수정 사항이 추가되었습니다 .

확장 된 유클리드 알고리즘을 사용하는 답변. 그래도 장소에서 약간 어색하고, 나는 그것을 더 골프화하기를 희망합니다. 정수 나누기 ( //) 에 바이트를 저장하기 위해 파이썬 2로 변환 할 수는 있지만 파이썬 2의 %모듈러스 연산자가 음의 두 번째 인수로 어떻게 작동 하는지 잘 모르겠습니다 . 출력을 올바르게 얻는 데 중요합니다.

def e(a,b):
 r=b;x=a;s=z=0;t=y=1
 while r:q=x/r;x,r=r,x%r;y,s=s,y-q*s;z,t=t,z-q*t
 return y%(b/x),z%(-a/x)

언 골프 드 :

def e(a, b):
    r = b
    x = a    # becomes gcd(a, b)
    s = 0
    y = 1    # the coefficient of a
    t = 1
    z = 0    # the coefficient of b
    while r:
        q = x / r
        x, r = r, x % r
        y, s = s, y - q * s
        z, t = t, z - q * t
    return y % (b / x), z % (-a / x) # modulus in this way so that y is positive and z is negative

익명의 사용자가 kungolfed 버전의 마지막 행에 변수 가 정의되어 있지 않다고 지적했습니다 .
Jonathan Frech

@JonathanFrech 아, 감사합니다!
Sherlock9

1

Mathematica, 80 바이트

f@l_:=Mod@@NestWhile[{Last@#,{1,-Quotient@@(#.l)}.#}&,{{1,0},{0,1}},Last@#.l>0&]

설명 :

확장 유클리드 알고리즘 은 여기에서 Nest스타일로 사용됩니다. 계수가 배열에 저장되는 방법으로 사용할 수 있습니다 Dot.

또 다른 가능한 표현은 u a - v bwith와 같은 기호 표현을 사용하는 것 입니다 {a->19, b->17}. 이러한 표현은 Mathematica의 기능을 사용하며 흥미롭지 만 바이트 단위로 훨씬 더 길다.


테스트 사례 :

f[{5, 3}]              (* {2, -3} *)
f[{42, 12}]            (* {1, -3} *)
f[{11235813, 112358}]  (* {8643, -864301} *)

1

루비, 83 바이트

이 솔루션을 미세 조정하고 골프를 칠 수있는 몇 가지 방법이 있다고 생각하지만 지금까지는 좋아합니다. 다음에는 확장 된 유클리드 알고리즘 솔루션을 사용해 보겠습니다.

->x,y{a=b=0;y.downto(0).map{|u|(-x..0).map{|v|a,b=u,v if u*x+v*y==x.gcd(y)}};p a,b}

작동 원리

의 루프와이 코드의 시작 u에서 y의 내부 루프와 아래로 0, v에서 -x우리는 모든 체크 0으로, 내부 uv경우를 u*x+v*y == gcd(x, y). 길을 따라 여러 개의 일치 항목이있을 수 있기 때문에 (매우 철저한 검색 사용) 여러 개의 일치 항목 중 마지막 일치 항목을 얻을 때 0 |u||v|가장 가까운 일치 항목 이되도록 0에서 시작합니다.

def bezout(x,y)
  a=b=0
  y.downto(0).each do |u|
    (-x..0).each do |v|
      if u*x + v*y == x.gcd(y)
        a,b=u,v
      end
    end
  end
  p a,b
end

@Bruce_Forte Darn. 해당 테스트 케이스에 대한 IRB 메모리가 부족합니다. 최대한 빨리 확장 된 유클리드 알고리즘 솔루션을 작성하겠습니다.
Sherlock9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.