【问题标题】:How does this method, which finds the smallest factor of a given number, work?这种找到给定数字的最小因子的方法如何工作?
【发布时间】:2016-05-02 15:32:52
【问题描述】:

我最近遇到了一个返回给定数字的最小因子的方法:

public static int findFactor(int n) 
{
    int i = 1;

    int j = n - 1;

    int p = j; // invariant: p = i * j

    while(p != n && i < j) 
    {
        i++; 
        p += j;

        while(p > n) 
        {
            j--; 
            p -= i;
        }
    }

    return p == n ? i : n;
}

在检查了该方法之后,我已经能够(很可能是错误地)确定了一些变量分别代表的数量:

n = the int that is subject to factorization for 
    the purposes of determining its smallest factor

i = the next potential factor of n to be tested

j = the smallest integer which i can be multiplied by to yield a value >= n

问题是我不知道p 代表什么数量。内部循环似乎将(p+=j) - n 视为 i 的潜在倍数,但鉴于我相信 j 所代表的,我不明白这怎么可能是真的 对于所有i,或者外循环如何解释执行的内循环的“额外”迭代 在后者因p &lt; n而终止之前

假设我已正确确定nij 代表什么,那么p 代表什么数量?

如果我的任何决定不正确,每个数量代表什么?

【问题讨论】:

    标签: algorithm language-agnostic factorization


    【解决方案1】:

    p 代表“产品”。如前所述,不变量是p == i*j;并且算法尝试ij 的不同组合,直到乘积(p)等于n。如果它永远不会(while 循环失败),你会得到p != n,因此返回nn 是素数)。

    在外部while 循环体的末尾,j 是最大的整数,i 可以乘以得到一个≤n 的值。

    该算法避免显式除法,并尝试限制为每个i 检查的j 值的数量。在外循环的开头,p==i*j 刚好小于n。随着i 逐渐增大,j 需要逐渐缩小。在每个外部循环中,i 增加(并且p 被更正以匹配不变量)。然后内部循环减小j(并纠正p)直到p 再次≤n。由于i*j 在下一个外循环开始时小于n,增加i 会使乘积再次大于n,并重复该过程。

    【讨论】:

      【解决方案2】:

      该算法尝试1n / i 之间的所有除数(继续过去n / i 没有用,因为相应的商已经尝试过了)。

      所以外部循环实际上执行了

      i= 1
      while i * (n / i) != n && i < n / i)
      {
        i++;
      }
      

      它以一种巧妙的方式做到了这一点,避免了分歧。正如注释所说,保持不变的p = i * j;更准确地说,p 是不超过ni最大倍数,这实际上建立了j = n / i

      i 增加时,需要进行一些调整:i 变为 i + 1 使 p = i * j 变为 (i + 1) * j = p + j,并且p 可能变得太大。通过根据需要将 j 递减多次 (j--, p-= i) 来解决此问题。

      【讨论】:

      • 虽然我接受了mindriot 提交的答案,但我想让你知道,你的答案,尤其是最后一段,对我对方法的理解起到了关键作用。谢谢!
      • @kevin:干杯。我推荐“Edsger W. Dijkstra, W. H. J. Feijen, Joke Sterringa 的一种编程方法”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      相关资源
      最近更新 更多