新しく発言する  EXIT  インデックスへ
拡張ユークリッド互除法

  拡張ユークリッド互除法 山中和義 2008/01/08 11:40:31  (修正1回)
  別解(繰り返し、MAT文による) 山中和義 2008/01/10 16:10:41 

  拡張ユークリッド互除法 山中和義 2008/01/08 11:40:31  (修正1回)  ツリーへ

拡張ユークリッド互除法  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/01/08 11:40:31 ** この記事は1回修正されてます
!問い
!29リットル入るバケツと17リットル入るバケツがある。
!この2つのバケツを使って、別のバケツに1リットルの水を入れる。

!答え
!17リットルのバケツで12回くみ入れた後、29リットルのバケツで7回くみ出す

LET a=17
LET b=29
CALL ExGCD(a,b ,s,t,c)
PRINT s;"*";a;" + ";t;"*";b;"=";c

END


EXTERNAL SUB ExGCD(a,b, s,t,c) !a>0,b>0 に対して s*a+t*b=c となる s,t,c=Gcd(a,b) を求める
IF b=0 THEN
LET s=1
LET t=0
LET c=a
ELSE
LET q=INT(a/b) !Qi ※Rk-1 = Qk*Rk + Rk+1より
LET r=MOD(a,b) !Ri
CALL ExGCD(b,r, u,v,c) !k=n-1,…,3,2 まで続ける
LET s=v
LET t=u-v*q
END IF
END SUB



samplesフォルダ内EUCLID.BAS参照

  別解(繰り返し、MAT文による) 山中和義 2008/01/10 16:10:41   ツリーへ

Re: 拡張ユークリッド互除法  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/01/10 16:10:41
別解(繰り返し、MAT文による)



!拡張ユークリッド互除法

!「a*x+b*y=GCD(a,b)となるxとyが存在する 」

!補助式
! a*x1+b*y1=z1
! a*x2+b*y2=z2
!を考える。
!z1/z2の商Q、余りRと置くと、z1=Q*z2+R。
!したがって、R=z1-Q*z2=a*x1+by1 - Q*(a*x2+b*y2)=a*(x1-Q*x2) + b*(y1-Q*y2)。
!ここでa*x3+by3=z3と比較して、
!x3=x1-Q*x2, y3=y1-Q*y2, z3=R=z1-Q*z2


INPUT PROMPT "2つの正の整数": a,b

DIM v1(3),v2(3),v3(3)
LET v1(1)=1 !x1
LET v1(2)=0 !y1
LET v1(3)=a !z1

LET v2(1)=0 !x2
LET v2(2)=1 !y3
LET v2(3)=b !z3

DO UNTIL v2(3)=0 !z2=0まで
LET Q=INT(v1(3)/v2(3)) !z1/z2の商

DIM t(3) !(x3,y3,z3)=(x1,y1,z1)-Q*(x2,y2,z2)
MAT t=Q*v2
MAT v3=v1-t

MAT v1=v2 !(x1,y1,z1)=(x2,y2,z2)

MAT v2=v3 !(x2,y2,z2)=(x3,y3,z3)
LOOP

PRINT "x,y,GCD(a,b)"
MAT PRINT v1

END


 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。