gpt4 book ai didi

c - 计算整数的所有因子的最快算法是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:41:39 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Algorithm to find all the exact divisors of a given integer

(7 个回答)


8年前关闭。




我已经编写了这段代码,但它花费了大量时间来计算......
你能帮我找出一种有效的方法吗?

int tag;
int* factors(int n)
{
int a[1000000];
for(int i=1;i<=n/2;i++)
if(n%i==0)
a[++tag]=i;
a[++tag]=n;
return(a);
}

这种蛮力方法在复杂性方面非常庞大......
这个问题有没有更好的可行解决方案?

最佳答案

到目前为止,还没有人想出一种比 的算法。这并不一定意味着没有,因为另一方面,也没有证明不可能更快地做到这一点。

您可能想要考虑的一种优化是,没有必要搜索最多 n/2,您可以在达到 sqrt (n) 时停止。

...如果您真的想返回“克里斯”评论中已经提到的所有候选人的列表,请务必为您的号码选择不同的存储位置。

编辑:

正如我被告知有相当多的算法可用,就时间复杂度而言,它们的运行速度可能比您询问的算法快一点,可能会指示添加比上面给出的简短评论更多的单词。

除了最明显的可能性之外,在首先将循环划分为奇数之后,只需以 2 步运行循环来保护一些计算时间,还有一些其他技巧可用,但我没有提到它们作为 实质上 在答案中更快上面给出。

导致这个决定的主要原因是,例如,虽然将迭代次数减少 2 倍,与运行时的预期增长相比似乎是一个巨大的胜利,但随着数字的增长,增加了一个衡量的 yield 常数变得如此之小,以至于在复杂性理论中甚至根本不会产生任何区别,并且可以说两种算法具有(几乎)相同的时间复杂度。

即使有可能获得 常数 的原始算法运行时间数千亿倍的增益,它们之间仍然不会有任何区别。

数字越大,任何常数的影响就越小,如果它也随着您要处理的数字的大小而迅速增长,那么它就与您在运行时方面所能想象的一样大。

在时间复杂度方面的一个非常特殊的障碍通常被认为是实际可行和完全不可能之间的边界,就是所谓的 polynomial 运行时。

这意味着即使运行时可能会随着 n 的增长而急剧增长,但仍然可以用 常数 指数 k 来描述这种增长,这样运行时就是围绕 n^k 的东西。

另一方面,没有 polynomial 运行时的算法不能用任何指数来衡量,你可能想要它有多大。

为了举例说明为什么这种差异可能真的很重要,让我们看一下两个虚构的算法。第一个具有多项式运行时,例如 n^10 ,而另一个则使用运行时 n! 说这个。

虽然它对于小数似乎并不坏,但假设 n 只是 10,这里算法第一个采用 10^10 = 10000000000 时间单位,而只有 3628800 单位,我们的第二个算法似乎运行得更快。

我们的算法二的问题是,与算法一相比,它的运行时间会增长得更快。在 n=100 你会得到类似的东西:算法一的 100000000000000000000 而它已经是算法二的 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

使用 n=1000 进一步插入前沿,我们最终得到:算法一在 1000000000000000000000000000000 而我们的第二个算法将采用类似 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 的东西。

不信你自己算算。 bc 手册甚至包含如何实现阶乘函数的示例。

但是在数数时不要头晕……
即使我们以普朗克时间为单位进行测量,知道我们必须在 10 上添加多少个尾随零才能得到乘以我们的宇宙年龄以获得如此大的时间跨度的因子可能会很有趣。不幸的是我不知道。

有趣的是,直到今天,还没有任何已知的算法可以在 polynomial 时间执行因式分解。

由于它本身不仅是一个有趣的研究领域, 实用的 不可能分解大整数也在当今广泛使用的 RSA 公钥加密算法中发挥着重要作用,因此几乎自然而然地已经有很多在这方面的研究。

发现算法(不打破已经提到的障碍)运行 比您想象的算法快

由于“Jim Balter”已经在他的评论中正确注释,您可能需要查看引用文章(请参阅: http://en.wikipedia.org/wiki/Integer_factorization#General-purpose )以了解其他人已经提出的方法。

“Jim”也提到的这篇文章可能是另一个有趣的资源:(参见:What is the fastest factorization algorithm?)

另一个值得查看的有趣链接可能是过去几年 RSA 因式分解挑战获胜者的名单,以某种方式了解今天可行和几乎不可能之间的界限在哪里。 ( http://en.wikipedia.org/wiki/RSA_Factoring_Challenge )

关于c - 计算整数的所有因子的最快算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15697166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com