ベズーのアイデンティティ


11

ベズーのアイデンティティの紹介

2つの整数A、BのGCDは、残りを残さずにそれらを分割する最大の正の整数です。ユークリッドの性質により、各整数Nは次のように別の整数Mで除算できます。

                                           ユークリッド部門

次のように書けるようなペアu、vが存在します。

                                           ベズーのアイデンティティ

これらのペアは無限にあるため、特別なペアを見つけたいと思います。実際には、(A、Bがゼロではない)そのようなペアが2つあります。

                                           意味のある(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

Haskell、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

Python 3、101 106バイト

編集:Bruce_Forteによって提案されたいくつかの改善と修正を追加しました。

拡張ユークリッドアルゴリズムを使用する回答。それは場所で少し不格好ですが、私はそれをもう少しゴルフしたいと思っています。Python 2に変換して整数の除算(//)でバイトを節約できましたが、Python 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

匿名ユーザーが、変更されていkないバージョンの最後の行の変数が未定義であることを指摘しました。
ジョナサンフレッチ

@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

Ruby、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から-x0まで、我々はすべてのを確認して内側uvあればu*x+v*y == gcd(x, y)。途中で複数の一致がある可能性があるため(これは非常に網羅的な検索を使用します)、0から遠く離れて開始し、複数の一致の最後を取得すると、0に最も近い場所に|u|なり|v|ます。

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ダーン。IRBは、そのテストケースのメモリを使い果たしました。できるだけ早く拡張ユークリッドアルゴリズムソリューションを作成します。
Sherlock9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.