保理大量

时间:2015-04-20 05:11:27

标签: sml

需要一种以ml计算大数的方法,忽略1和数字。我的方式仅适用于小数字,它主要涉及从最低可能的2个因子开始,并检查它们是否相乘,它们是否等于数字,否则保持循环。这对大数字不起作用,因为它需要太多的递归调用

fun factor n=

let
    val f1 = 2
    val f2 = 3
    fun lp f1 f2 = if f1 *f2 = n then (f1,f2)
                                 else if f2 = (n-1)
                                 then lp (f1+1) 2
                                 else lp f1 (f2+1)
in
    (lp f1 f2)
end;

1 个答案:

答案 0 :(得分:1)

将数字n分解的典型方法是从2循环到sqrt(n),每次检查n是否可被当前循环索引整除。您的实施存在一些问题。首先,(如上面的评论之一所述)如果给出的数字是素数,你将进入无限循环。其次,您正在检查冗余案例。下面给出了获得数字所有因子的函数:

fun factor n = 
  let val sqrtN = Real.ceil(Math.sqrt (Real.fromInt n))
    fun lp(i, factors) = 
          if i > sqrtN
          then factors
          else
              if Int.mod(n, i) = 0
              then lp(i+1, (i, n div i)::factors)
              else lp(i+1, factors)
  in lp(2, nil) end

这似乎能够处理大量数字,并且具有提供数字的所有因素的额外好处。如果您希望在找到一个解决方案后发生短路,那么您可以将lp(i+1, (i, n div i)::factors)更改为(i, n div i)并从lp中删除第二个参数