最小公倍数可能与N log C一样大,但是如果N个数字是随机分布的,那么最小公倍数可能会小很多,可能比N小很多。我会建立其中的表质数是哪个数的除数。
对于每个质数p,我们都有一个索引,这意味着直到该索引的所有数字都已被p进行了运算,并且列出了所有可被其整除的数字。kp
然后,对于d = 2、3、4,...,我们尝试找到可被d整除的数字,或显示没有数字。我们取d的最大素数p。然后,我们检查所有可被p整除的数是否也可被d整除。如果没有找到,那么我们检查更多索引>数字是否可被p整除,更新和可被p整除的数字列表,并检查每个数字是否可被d整除。kpkp
要检查是否存在一个可被p整除的数字,我们检查平均p个数字。稍后,如果我们检查是否有一个数字可被2p整除,则有50%的机会我们只需要检查一个数字(一个可被p整除的数字),而有50%的机会检查另外2p个数字。找到一个可被3p整除的数字很可能很快,依此类推,而且我们永远不会检查N个以上的数字来区分p,因为只有N个数字。
我希望这能解决约可除性检查。N2/logN
PS。随机数的结果有多大?
假设我有N个随机数。N个数字之一可被d整除的概率是1-(1-1 / d)^ N。我假设将1≤d≤k的每个数字作为随机数之一的因子的可能性是通过将这些概率相乘得出的(好吧,这有点狡猾,因为这些概率可能不太完全独立)。
在此假设下,当N = 1000时,数字1..244之一不将任何数字相除的可能性为50%,十亿分之一的数字(直至507)最多将一个数字相除。在N = 10,000的情况下,数字1..1726中的一个不除任何数字的可能性为50%,十亿分之一中的每个数字(直到2979)均除以其中一个数字。
我建议对于N个随机输入,结果的大小比N / ln N大;可能类似于N / ln N *(ln ln N)^ 2。原因如下:
的概率是N个随机数中的至少一个是由随机d整除是。如果d在N附近,则大约是1-exp(-1)≈0.6321。那是一个除数;数d≈N中的每一个都是N个数中至少一个的除数的机会很小,因此最大值d明显小于N。1−(1−1/d)N1−(1−1/d)N
如果d << N,则。1−(1−1/d)N≈1−exp(−N/d)
如果d≈N / LN N再按。1−exp(−N/d)≈1−exp(−lnN)=1−1/N
我们将这些概率添加为大约N / ln N值d,但是对于大多数d而言,结果将显着更大,因此最大d将以某种方式大于N / ln N但显着小于N。
PS。查找可被d整除的数字:
我们选择d的最大素数p,然后首先检查已知可被p整除的数。假设d = kp。然后平均而言,在检查此特定的d时,我们仅检查可被p整除的k个数,对于所有可被p整除的d,我们最多检查所有N个值的可整除性。实际上,对于大多数素数p,我们最有可能检查少于N个值,因为在检查了所有N个值之后,该算法最有可能结束。因此,如果结果为R,则我希望小于N的值除以小于R的每个素数。假设R≤N,则大约为N ^ 2 / log N个检查。
PS。运行一些测试
我使用N = 1,000,000个随机数> 0多次运行了该算法。最不常见的非除数在68,000和128,000之间,并且绝大部分运算在100,000和120,000之间。分割的数量在5.2亿至18亿之间,比(N / ln N)^ 2少得多;大多数案例使用了1000到15亿个分区。