Algorithm 我有一个新的算法来寻找线性时间中的因子或素数-需要对此进行验证

Algorithm 我有一个新的算法来寻找线性时间中的因子或素数-需要对此进行验证,algorithm,complexity-theory,primes,factorization,Algorithm,Complexity Theory,Primes,Factorization,我已经开发了一种算法来寻找给定数字的因子。因此,它也有助于发现给定的数字是否是素数。我觉得这是寻找因子或素数的最快算法 该算法确定给定数字在5*N的时间范围内是否为素数(其中N是输入数字)。所以我希望我能称之为线性时间算法 如何验证这是否是可用的最快算法?在这件事上有人能帮忙吗?(比GNFS和其他已知速度更快) 算法如下所示 Input: A Number (whose factors is to be found) Output: The two factor of the Number. I

我已经开发了一种算法来寻找给定数字的因子。因此,它也有助于发现给定的数字是否是素数。我觉得这是寻找因子或素数的最快算法

该算法确定给定数字在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
请提供您的意见。。如需更多信息,请随时与我联系

谢谢, 哈里什
“线性时间”是指与输入数据长度成比例的时间:在本例中,您试图分解的数字中的位数。你的算法不是在线性时间内运行的,也不是在接近线性时间的时间内运行的,我担心它比许多现有的因式分解算法要慢得多。(包括,例如GNFS。)

我没有仔细研究您的算法,但素数测试通常比O(n)(其中n是输入数)快。举个简单的例子:

def isprime(n):
   for f in range(2,int(sqrt(n))):
      if n % f == 0:
         return "not prime"
   return "prime"

在这里,只要检查所有可能的因子直到sqrt(n),就可以在O(sqrt(n))中确定n是否为素数。

在这种情况下,输入的大小不是n,而是n中的位数,因此算法的运行时间与输入的大小成指数关系。这被称为

如果有两个以上的因素呢?+1代表你的好问题和好试验。我不敢相信你的问题被看了68遍,一个答案得到了+6票,没有人投票支持你。因此,它被打破了。简单明了。提出问题的人应该在每次答案被投票表决时得到代表。也许每一个答案都会有十分之一的代表分。@SyntaxT3rr0r:好吧,建议在上(尽管我认为它会被拒绝,因为有这样的问题)@BlueRaja-Danny pflughoft:好吧,通过对每个问题设置一个上限就可以很容易地解决这个问题。例如,每个“答案”最多可以得到+10个代表分,因此在400多张投票中,他只能得到+10分,而且他仍然会得到负面代表,因为他的问题得分为-40。好主意:总有一天我会建议的。谢谢你的回复。如果你有时间,我想了解更多。我对算法分析的理解确实较少。通过这个算法,我计算了确定一个数为素数的步数,大约为5*N(其中N是输入数)。以1个单位为时间,我将算法的时间设为5*N。这里的步骤数仅包括基本的加法、减法和比较(基于我博客中给出的算法)。您是否参考了任何资源,通过这些资源我可以知道如何根据输入大小查找所花费的时间?或者你能告诉我所需的步骤吗?输入大小大约为log_2(N);也就是说,N大约是2^b,其中b是以位为单位的输入大小。所以算法的运行时间与2^b成正比。。。但事实上比这更糟糕,因为对于非常大的数字,像加法和乘法运算不是常数时间运算;加法需要与b成比例的时间,乘法和除法更像是b log b。因此,您的算法的运行时类似于2^b log b。另一方面,GNFS类似于exp((Ab)^1/3(log b)^2/3),其中A是一个恰好为64/9的常数。例如,如果b=100,那么2^b log b是一个大约33位长的数字,而exp((Ab)^1/3(log b)^2/3)是一个大约11位长的数字。因此,如果我们忽略这两个估计前面的常数因子,假设它们是运算计数,如果我们假设每秒可以进行10^9次运算,然后GNFS可以在大约100秒的时间内将一个100位的数字分解成因数,而你的算法需要大约10^16年。@hammar和@sth:请在Gareth McCaughan对我的问题的回复中找到我对你评论的回复。如果你们中有人能帮助我计算这个算法所花费的时间,谢谢你们?