不使用gcd的最小公倍数

时间:2016-04-20 18:12:42

标签: haskell

使用gcd相当容易,但我不明白如何配合所有功能,以实现它没有。

kgv :: Int -> Int -> Int
kgv x y =  abs ((x `quot` (gcd x y)) * y)

我得到了这个函数来找到有效的素数因子(prime_factors),我正在研究一个函数,它从一个列表中获取最大数,并检查它是否在另一个列表中{{1} }):

comp

4 个答案:

答案 0 :(得分:3)

这是我正在讨论的(非常)天真的算法:

kgv :: (Ord a, Num a) => a -> a -> a
kgv x y = find x y
  where find i j
          | i == j = i
          | i < j = find (i+x) j
          | i > j = find i (j+y)

它基本上是学童会做的事情;)

警告我忽略了负数和0 - 你可能不得不处理那些

答案 1 :(得分:3)

或许另一种简单的方法是

import Data.List(intersect)
lcm m n = head $ intersect (series m n) (series n m)     
    where series a b = take a $ map (*b) [1..]

答案 2 :(得分:3)

这是一个荒谬简单且极其低效的解决方案:

lcm m n = head [x | x <- [1..], x `rem` m == 0, x `rem` n == 0]

当然,这依赖于两种不同的概念,即#34;最少&#34;在他们这样做的情况下重合。一个完全天真的解决方案似乎不可能。

答案 3 :(得分:0)

我大部分都是自己想的。感谢您的想法和指示。

ggt n m   | n > m     = maximum [t | t <- [1 .. m], gt n m t]
    | otherwise = maximum [t | t <- [1 .. n], gt n m t]
gt n m c              = t n c  && t m c
t n c     | n >= c    = (mod n c == 0)
    | otherwise = False

kgv :: Int -> Int -> Int
kgv x y |x==0=0|y==0=0 |otherwise = abs ((x `quot` (ggt x y)) * y)