Function 扩展欧几里德算法的实现

Function 扩展欧几里德算法的实现,function,haskell,greatest-common-divisor,Function,Haskell,Greatest Common Divisor,我想做一个函数,它给定两个整数n和m,返回一个三重整数 (a,b,gcd(n,m)),以便: am+bn=gcd(n,m) 不应假定整数始终为正 gcd :: Int -> Int -> Int gcd n m | n == m = n | n > m = gcd (n-m) m | n < m = gcd n (m-n) combine :: Int ->Int -> (Int,Int,Int) x1=1; y1=0; x2=0; y2

我想做一个函数,它给定两个整数n和m,返回一个三重整数 (a,b,gcd(n,m)),以便: am+bn=gcd(n,m) 不应假定整数始终为正

 gcd :: Int -> Int -> Int
 gcd n m 
 | n == m  = n
 | n > m = gcd (n-m) m
 | n < m  = gcd n (m-n)

 combine :: Int ->Int -> (Int,Int,Int)
 x1=1; y1=0; x2=0; y2=1
 while ( m /=0 ) 
 (    q=div n m ; r=mod n m ; n=m ; m=r
     t=x2 ; x2=x1-q*x2 ; x1=t
     t=y2 ; y2=y1-q*y2 ; y1=t    )
 combine n m = (x1,y1,gcd(n,m))
gcd::Int->Int->Int
gcd n m
|n==m=n
|n>m=gcd(n-m)m
|nInt->(Int,Int,Int)
x1=1;y1=0;x2=0;y2=1
而(m/=0)
(q=div n m;r=mod n m;n=m;m=r
t=x2;x2=x1-q*x2;x1=t
t=y2;y2=y1-q*y2;y1=t)
联合收割机n m=(x1,y1,gcd(n,m))
您将找到一个屏幕捕获图片链接。点击我--->![链接]如果有人有解决方案,并且知道我可以替换什么来创建该功能,我们将不胜感激。
函数测试:combine 3 2应给出此结果=>(1,-1,1)

我想您可能正在寻找类似的结果:

combine :: Int ->Int -> (Int,Int,Int)
combine n m = (x1, y1, gcd n m) where
  (x1, y1) = gcdext n m

gcdext :: Int -> Int -> (Int, Int)
gcdext n m = gcdexthelper n m 1 0 0 1 where
  gcdexthelper n m x1 y1 x2 y2 
   | m == 0 = (x1, y1)
   | otherwise = gcdexthelper m r x1p y1p x2p y2p where
     q = div n m
     r = mod n m
     x1p = x2
     y1p = y2
     x2p = x1 - q * x2
     y2p = y1 - q * y2
当然,您可以使用
while
循环实现相同的功能,但我相信递归在Haskell中更具可读性,所以我在这里使用了它


顺便说一下,GCD是Haskell中的标准库函数,因此无需编写自己的函数。

哦,我明白了!我试过了,结果它已经在里面了。但是,我纠正了您的一个错误,在这里-->combine n m=(x1,y1,gcdx n m)gcd**。无论如何,Haskell是一种不同寻常的语言,我还不知道它的库。感谢您的快速响应、解释和帮助!P.S[Idk为什么我已经得到了-3的利率]:你也可以使用
(q,r)=divMod n m