SML中n-1个元素的LCM

SML中n-1个元素的LCM,sml,lcm,Sml,Lcm,我有以下函数来计算列表中所有元素的LCM。是否有任何关于计算每个(n-1)子集的每个LCM并将其存储在列表中的提示 fun modulo (_,0) = 0 | modulo (0,_) = 0 | modulo (x,y) = if y > x then x else let fun getMod(z) = if z >= y then getMod(z-y) else z in getMod(x) end fun lcm

我有以下函数来计算列表中所有元素的LCM。是否有任何关于计算每个(n-1)子集的每个LCM并将其存储在列表中的提示

fun modulo (_,0) = 0
  | modulo (0,_) = 0
  | modulo (x,y) = if y > x then x else
    let
      fun getMod(z) = if z >= y then getMod(z-y) else z
    in
      getMod(x)
    end

fun lcm (0,_) = 0
  | lcm (_,0) = 0
  | lcm (x,y) = 
    let
      fun findLcm (base,mult,v) =
          if modulo(mult,v) = 0
          then mult
          else findLcm(base,mult+base,v)
    in
      if x > y then findLcm(x,x,y) else findLcm(y,y,x)
    end

fun ekp(xs) =
    case xs of
         []       => 1
       | (x::xs') => lcm(x,ekp(xs'))
假设“S的(n-1)子集”是指{S\{x}|x∈ S},S的子集集,其中S的每个元素都删除了一个元素,您可以通过首先生成集合,然后对每个子集应用最小公倍数算法,轻松地生成其中每个元素的最小公倍数

以下是生成最小公倍数的较短方法:

功能
lcm\u列表
对应于您的功能
ekp

要获取从每个子集中删除一个元素的子集列表(假设没有重复项):

并生成每个子集的最小公倍数

- subsets1 [3,4,5];
> val it = [[4, 5], [3, 5], [3, 4]] : int list list
- map lcm_list (subsets1 [3,4,5]);
> val it = [20, 15, 12] : int list
也就是说,{3,4,5}的(n-1)子集被发现为{4,5}、{3,5}、{3,4},并且这些(n-1)子集的最小公倍数是{lcm(4,5)、lcm(3,5)、lcm(3,4)}={20,15,12}。此时,可能已经进行了一些冗余工作。对于任何较大的列表,子集集将有大量重叠。比如说,

- subsets1 [3,4,5,6,7,8];
> val it =
    [ [4, 5, 6, 7, 8],
      [3, 5, 6, 7, 8],
      [3, 4, 6, 7, 8],
      [3, 4, 5, 7, 8],
      [3, 4, 5, 6, 8],
      [3, 4, 5, 6, 7] ] : int list list
使用上述方法,我们将计算
lcm(3,4)
=12四次,
lcm(12,5)
=60三次,等等。您可能会受益于
lcm
函数的加速,尽管它并不十分昂贵。

什么是(n-1)子集?尝试并提供一个例子。这听起来像是家庭作业。
- subsets1 [3,4,5];
> val it = [[4, 5], [3, 5], [3, 4]] : int list list
- map lcm_list (subsets1 [3,4,5]);
> val it = [20, 15, 12] : int list
- subsets1 [3,4,5,6,7,8];
> val it =
    [ [4, 5, 6, 7, 8],
      [3, 5, 6, 7, 8],
      [3, 4, 6, 7, 8],
      [3, 4, 5, 7, 8],
      [3, 4, 5, 6, 8],
      [3, 4, 5, 6, 7] ] : int list list