2011-10-27 2 views
5

저는 하스켈에게 매우 새롭습니다.하스켈 GCF/LCM

하스켈에서 GCF 또는 LCM (Least Common Multiple)을 찾는 간단한 방법이 있습니까?

답변

7

LCF가 무엇인지 잘 모르겠지만 GCF는 하스켈이 가장 좋아합니다. Euclidean Algroithm을 사용하면 하스켈의 작동 방식을 실제로 이해할 수 있습니다. http://en.wikipedia.org/wiki/Euclidean_algorithm 여기에 알고리즘을 설정하는 방법에 대한 훌륭한 설명이 있습니다 http://en.literateprograms.org/Euclidean_algorithm_(Haskell).

이 유형의 재귀는 하스켈에서 일반적이며 언어가 얼마나 표현력이 좋은지를 보여줍니다.

gcd a 0 = a 
gcd a b = gcd b (a `mod` b) 

이 어떤 수의 최대 공약수를 말 인수에 패턴 매칭을 사용하고 0은 최초의 번호입니다. 숫자가 모두 0이 아닌 경우 두 번째와 첫 번째 모드의 가장 큰 공통 요소를 찾습니다. 결국 이것은 두 번째 인수에서 0에 도달합니다. 이것은 첫 번째 패턴을 트리거하고 첫 번째 인수를 반환합니다.

함수 실제로되어야

[EDIT]

:

gcd a 0 = a 
gcd a b = b `seq` gcd b (a `mod` b) where 

이 이전 순환 공정의 (a mod b)의 ​​평가를 강제 거대한 썽크 방지 할 메모리의 경우에 내장되고 GFCing 1243235452와 6095689787662입니다. Seq는 인수를 "Weak Head Normal Form"으로 강제 설정하거나 인수의 가장 외부 데이터 구조를 평가합니다.

+0

아마 여기에'seq'에 추가해야 할 수 있습니다. – alternative

+0

물론입니다. OP는 하스켈에게 새로운 것이지만, 이것을 배우기에 좋은 시간입니다. –

+0

OP가 아마 이것을 알고 있을지 모르지만'lcm ab = gcd ab (div ag) * b'에서 –

12

GCF는 가장 큰 공통 인자 또는 최대 공약수를 의미합니까? 그것은 gcd이며, 서곡에서 얻을 수 있으며, 최소 공배수 인 lcm입니다.

3

gcd은 서곡에서 가져 왔습니다. 즉, 아무 것도하지 않고도 언제든지 사용할 수 있습니다. Erik Hinton은 자신의 구현에 관심이 있다면 유클리드 알고리즘의 간단한 버전을 보여줍니다. 그러나 한 가지 : /은 부동 소수점 나누기에만 사용되며 divmod을 사용하면 "정수 나누기"를 수행 할 때 몫과 나머지를 찾을 수 있습니다. 서곡은 또한 최소 공배수에 대해 lcm 함수를 정의합니다.

0

또는 당신은 또한

euclid(n,m) = 
    if n == m then n 
    else if n < m then euclid(n, m-n) 
    else euclid(n-m, m)