我有一个新算法可以在线性时间内找到因子或素数 - 需要对此进行验证
Posted
技术标签:
【中文标题】我有一个新算法可以在线性时间内找到因子或素数 - 需要对此进行验证【英文标题】:I have a new algorithm to find factors or primes in linear time - need verification for this 【发布时间】:2011-07-31 15:55:12 【问题描述】:我开发了一种算法来查找给定数字的因子。因此,它还有助于确定给定数字是否为素数。我觉得这是寻找因子或素数的最快算法。
此算法在 5*N 的时间范围内查找给定数字是否为素数(其中 N 是输入数字)。所以我希望我可以称之为线性时间算法。
如何验证这是否是可用的最快算法?有人可以帮忙吗? (比 GNFS 和其他已知的更快)
算法如下
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
请提供您的 cmets.. 如有更多信息,请随时与我联系。
谢谢, 哈里什 http://randomoneness.blogspot.com/2011/09/algorithm-to-find-factors-or-primes-in.html
【问题讨论】:
如果有两个以上的因素怎么办? +1,感谢您提出的好问题和好试验。我不敢相信你的问题被看到了 68 次,一个答案得到了 +6 票,而且 NOBODY 投票给了你。所以坏了。干净利落。每次对答案进行投票时,提出问题的人都应该得到代表。可能每个回答赞成票的代表点数的 1/10 之类的。 @SyntaxT3rr0r:好吧,建议在meta 上使用(尽管我认为它会被拒绝,鉴于this 之类的问题) @BlueRaja - Danny Pflughoeft:嗯,通过限制每个问题的上限很容易解决。例如,每个“答案”最多可以获得 +10 个代表点,因此对于 400 个 +upvotes,他只会得到 +10 分,而且他仍然会得到负面代表,因为他的问题是 -40。好主意:我会在这些天的元数据上建议它。 【参考方案1】:“线性时间”是指与输入数据的长度成正比的时间:在这种情况下,您尝试分解的数字中的位数。您的算法不会在线性时间或任何接近它的时间内运行,恐怕它比许多现有的因式分解算法要慢得多。 (包括,例如,GNFS。)
【讨论】:
感谢您的回复。如果你有时间,我想了解更多。我对算法分析的理解确实比较少。我通过该算法计算了确定一个数是否为素数的步数约为 5*N(其中 N 是输入数)。并以1个单位为时间,我把算法的时间定为5*N。这里的步骤数量仅包括基本的加法、减法、比较(基于我的博客中给出的算法)。您是否对任何资源有任何参考,通过这些资源我可以知道如何根据输入大小查找所花费的时间?或者你能告诉我所需的步骤吗?谢谢 输入大小约为log_2(N);也就是说,N 约为 2^b,其中 b 是以位为单位的输入大小。所以你的算法的运行时间与 2^b 成正比......除了实际上它比这更糟糕,因为对于非常大的数字,像加法和乘法这样的操作不是恒定时间的操作;加法需要的时间与 b 成正比,而乘法和除法更像是 b log b。所以你的算法的运行时间类似于 2^b b log b。另一方面,GNFS 类似于 exp((Ab)^1/3 (log b)^2/3),其中 A 是一个常数,恰好是 64/9。 例如,如果 b=100,那么 2^bb log b 是一个大约 33 位长的数字,而 exp((Ab)^1/3 (log b)^2/3) 是一个大约 11 位数长的数字。 所以,如果我们忽略这两个估计值前面的常数因子,只假设它们是操作计数,并且假设我们每秒可以执行 10^9 次操作,那么 GNFS 可以分解一个100 位数字大约需要 100 秒,而您的算法需要大约 10^16 年。【参考方案2】:这种情况下输入的大小不是n,而是n中的位数,所以你的算法的运行时间是输入。这被称为pseudo-polynomial time。
【讨论】:
【参考方案3】:我没有仔细研究过你的算法,但素数测试通常比 O(n) 快(其中 n 是输入数字)。以这个简单的为例:
def isprime(n):
for f in range(2,int(sqrt(n))):
if n % f == 0:
return "not prime"
return "prime"
这里在 O(sqrt(n)) 中确定 n 是否为素数,只需检查所有可能的因素,直到 sqrt(n ).
【讨论】:
@hammar 和 @sth :请在 Gareth McCaughan 对我的问题的回复下找到我对您的 cmets 的回复作为评论。如果有人可以帮助我计算该算法所花费的时间,谢谢您?以上是关于我有一个新算法可以在线性时间内找到因子或素数 - 需要对此进行验证的主要内容,如果未能解决你的问题,请参考以下文章
sh (((bash shell script)))1。找到给定整数的素数因子,2。打印一个模式,3。告诉一个整数可以被11整除或不整除