计算整数的除数而不只是枚举它们(或估计如果不可能)? [关闭]

Posted

技术标签:

【中文标题】计算整数的除数而不只是枚举它们(或估计如果不可能)? [关闭]【英文标题】:Counting an integer's divisors without just enumerating them (or estimating if not possible)? [closed] 【发布时间】:2015-11-15 05:24:59 【问题描述】:

是否可以计算一个整数的除数而不只检查每个除数,直到sqrt(n)?如果没有,是否至少有一种方法可以估计近似有多少除数?

例如,28 有六个除数(1、2、4、7、14、28)。 15 有四个(1、3、5、15)。比如说,我想弄清楚 242134575355654335549798955848371716626563756785 有多少个除数,而不是一直算到那个数(或者至少猜测一下,然后从那里拿走)。

【问题讨论】:

你还能举一些例子吗? Integer Factorization Algorithms 我投票结束这个问题,因为它不是关于编程而是关于数学。 @HighPerformanceMark 我认为数学方面是“有多少除数”,而有效地计算除数更多的是关于编程(是的,使用数学洞察力)。 @TimBiegeleisen 你在找什么样的例子? 【参考方案1】:

如果一个数的素数分解已知

N = p1^e1 * p2^e2 * ... * pn^en

除数是(e1+1)*(e2+1)* ... *(en+1)

例如 242134575355654335549798955848371716626563756785 = 5 * 48426915071130867109959791169674343325312751357 有 4 个除数

排名第一的 242134575355654335549798955848371716626563756786 = 2 * 101203 * 757790982862309619 * 1578643235504300177689649 有 16 个除数。

有一些算法可以比试除法更快地找到一个数的素因式分解,直到sqrt(n)。对于大数字,仍需要一段时间...

【讨论】:

但是,问题是如何直接获得素因数分解! 如果有很多小因数,质因数分解会很快。 (你找到的每个除数都会减少问题的大小)。只有成为素数的数字,或大素数的乘积,才会花费大量时间。您的回答意味着没有任何技巧可以在不找到除数的情况下计算除数。你相当确定没有已知的算法吗?如果是这样,你知道它是否已被证明不存在吗?我的意思是,我不认为有一个,但我根本不是一个数论家,而且有很多我不知道的东西。 :P @PeterCordes 当然,人们永远无法确定没有技巧,而且我不知道有证据证明不存在。【参考方案2】:

有一种方法可以比 sqrt(N) 更快地分解一个数字,但如果 n Here 是一个很好的解释,我也从中学到了。你可以要求我澄清。

【讨论】:

这其实不是真的,有一些方法可以更快地分解。 你说有办法比 logN 更快或比 sqrt(n) 更快,并且 n 比 sqrt(N) 更快,n 嗯,我通常在竞争性的编程网站上闲逛,我添加了使算法在 1 秒内运行并且不让它使用太多内存作为习惯的条件。让我们删除条件并说有一种 nlogn 方法可以对数字进行因式分解。我们现在好吗:D

以上是关于计算整数的除数而不只是枚举它们(或估计如果不可能)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

UVa 1363 Joseph's Problem (等差数列)

小航的算法日记因子分解和枚举

打开枚举(带有标志属性)而不声明所有可能的组合?

c 语言中除号仅用于整数间吗?

Java除法运算的陷阱

Java中为啥整数除以0出现异常