【问题标题】:Need to know if this a Unique way to divide?需要知道这是否是一种独特的划分方式?
【发布时间】:2011-11-18 10:42:32
【问题描述】:

几个月前,我在 StackOverflow 的 "Algorithm to find factors for primes in linear time" 上提出了一个问题。

在回复中,我很清楚我的假设错误并且算法无法在线性时间内找到因素。

但是我想知道该算法是否是进行除法和查找因子的独特方法;那就是知道做任何类似/相同的划分方式吗?我再次在这里发布算法:

Input: A Number (whose factors is to be found)
Output: The two factor of the Number. If the one of the factor found is 1 then it can be concluded that the
Number is prime.

Integer N, mL, mR, r;
Integer temp1; // used for temporary data storage
mR = mL = square root of (N);
/*Check if perfect square*/
temp1 = mL * mR;
if temp1 equals N then
{
  r = 0; //answer is found
  End;
}
mR = N/mL; (have the value of mL less than mR)
r = N%mL;
while r not equals 0 do
{
  mL = mL-1;
  r = r+ mR;

  temp1 = r/mL;
  mR = mR + temp1;
  r = r%mL;
}
End; //mR and mL has answer

让我知道您的输入/这个问题纯粹是出于个人兴趣,想知道是否存在类似的算法来进行除法和查找因子,而我无法找到。

我理解并感谢您可能需要了解我的有趣算法才能给出答案! :)

进一步说明: 是的,它确实适用于 10 以上的数字(我测试过)和所有正整数。 该算法依赖于余数 r 继续进行。我基本上形成了这样的想法,即对于一个数字,它的因数给了我们 面积是数字本身的矩形。对于所有其他不是因数的数字,将有 剩下的部分,或者因此无法完整地形成矩形。 因此想法是对于mL的每减少,我们可以增加r = mR + r(基本上将一个mR从mRmL转移到r)然后这个大的r除以mL来看看我们可以增加多少mR(每减少一毫升,我们可以增加多少倍mR)。因此剩余的 r 是 r mod mL。 我已经计算了查找因子所需的 while 循环数,对于所有数字,它都低于或等于 5*N。审判分会需要更多时间。*

感谢您的宝贵时间,Harish

【问题讨论】:

  • 最坏情况是 5*N,它是什么数字?顺便说一句,简单试除法的最坏情况是 sqrt(N) 并且您的方法似乎具有相同的最坏情况运行时间。

标签: algorithm division factors


【解决方案1】:

主循环相当于下面的C代码:

mR = mL = sqrt(N);
...
mR = N/mL; // have the value of mL less than mR
r = N%mL;
while (r) {
  mL = mL-1;
  r += mR;
  mR = mR + r/mL;
  r = r%mL;
}

请注意,在每个r += mR 语句之后,r 的值是r%(mL-1)+mR。由于r%(mL-1) < mL,下一条语句中r/mL 的值要么是mR/mL,要么是1 + mR/mL。我同意(作为数值测试的结果)当你退出循环时它可以解决mR*mL = N,但我不明白为什么。如果您知道原因,您应该解释原因,如果您希望您的方法被认真对待。

就效率而言,您的方法使用与Fermat factorization 相同数量的循环,尽管可以在不使用任何除法的情况下编写费马分解的内部循环,其中您的方法使用两个除法运算(r/mL 和r%mL ) 在其内部循环内。在这两种方法的最坏情况下,内部循环运行大约 sqrt(N) 次。

【讨论】:

  • 解释;对于数字 371。371 ~ 19 的平方根。因此开始为: >>18*20+11 = 371 >>17*20+31 = 371 >>17*21+14 = 371 >>16*21+35 = 371 >>16*22+19= 371 >>16*23+3= 371 ..等等..考虑18*20(高*宽)是否是一个矩形。以 11 作为余数(行)。当从 18 中删除一条线时,这意味着我可以将 20 移动到余数,得到 31。由于 31 大于 18,我从 31 中删除了一个 18,我可以将其添加到矩形宽度,即从 20 到21、本次运算为除法运算,左为余数。
【解决方案2】:

还有其他一些,例如Pollard's rho algorithm,以及您在上一个问题中已经了解过的 GNFS。

【讨论】:

  • 是的,我知道还有其他方法可以找到因素。我的问题是:这是一种独特的方式吗——就像 Pollard 的 rho 算法和 GNFS 不同——这是否与所有其他现有方法不同?如果我不清楚,请告诉我。
  • @harish 好的,你的意思是,这与所有其他分解算法有根本不同吗?老实说,我根本不确定这是否是一种分解算法,它似乎是在做试验除法,但在一个移动的目标上,它真的有效吗?
  • 我正在编辑这个问题 - 回答您的评论并进一步解释这个问题,因为 cmets 部分中的 550 个字符几乎没有回复 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多