2016-04-12 13 views
-4

Genişletilmiş UYGULAMA n, m) Tam sayıların her zaman pozitif olacağını varsayalım., tamsayı (a, b, gcd (n, m)), bu şekilde bir üç döner bir fonksiyonu iki tamsayı, n ve m verilen olan kombine olmak için Öklid algoritma

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)) 

Bir ekran yakalama resmi bağlantısı bulacaksınız. Tıklayın bana --->! [Link] http://prikachi.com/images.php?images/238/8749238o.png Birisi bir çözüm varsa ve işlevi oluşturmak için neyi değiştirebileceğime dair bir fikrim varsa, çok takdir edilecektir. fonksiyon için Testi: 3 2 Bu sonucu vermelidir birleştirmek => (1, -1,1)

cevap

0

Ben böyle bir şey arıyor olabilir düşünüyorum:

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 

Elbette uygulayabilirsiniz while döngüsüyle aynıdır, ama ben, özveri Haskell'de çok daha okunabilir olduğuna inanıyorum, bu yüzden burada kullandım. Bu arada, GCD, Haskell'deki standart bir kütüphane işlevidir, bu yüzden kendi yazmanızı gerektirmez.

+0

Oh, anlıyorum! Denedim ve zaten içinde olduğunu ortaya çıktı. Ancak, bir hatayı düzeltmeden önce -> n birleştirme n = = (x1, y1, gcdx n m) gcd **. Her neyse, Haskell sıra dışı bir dil ve henüz kütüphanelerini bilmiyorum. Hızlı yanıt, açıklama ve yardım için teşekkürler! S.S [Neden -3 oranını aldığımı hatırla]: D –

+1

Ayrıca '(q, r) = divMod n m' kullanabilirsiniz. – chepner

İlgili konular