Java一到一万中五的因子_查找2和5因子的最快算法

如果您有十亿位数字,除非确实有必要,否则您不希望对其进行分割 . 如果你没有理由相信它在1 ^ 2 ^ 1000个可被2 ^ 1000整除的数字中,那么使用更快的测试只看最后几位是有意义的 . 您可以通过查看最后一位数字来判断一个数字是否可被2整除,通过查看最后两位数字是否可以被4整除,通过查看最后n位数字可以看出2 ^ n . 类似地,您可以通过查看最后一位数字来判断一个数字是否可被5整除,通过查看最后两位数字是否可以被25整除,通过查看最后n位数字可以将其除数为5 ^ n .

我建议你先计算并删除尾随的0,然后从最后一位开始判断你是在测试2的幂(最后一个数字2,4,6或8)还是5的幂(最后一个数字5) .

如果你测试的是2的幂,那么取最后的2个,4个,8个,16个...... 2 ^ i个数字,然后乘以25,625,... 5 ^ 2 ^ i,计算尾随的0最多2 ^ i(但不超出) . 如果你得到少于2 ^ i尾随0,那么停止 .

如果你测试5的幂,那么取最后的2,4,8,16,... 2 ^ i数字,并乘以4,16,... 2 ^ 2 ^ i,计算尾随的0s最多2 ^ i(但不超出) . 如果你少于2 ^ i尾随0,然后停止 .

例如,假设您分析的数字是283,795,456 . 乘以56乘25,你得到1400,其中有2个尾随0,继续 . 乘以5,456乘625,得到3,410,000,其中有4个尾随0,继续 . 乘以83,795,456乘以5 ^ 8 = 390,625,得到32,732,600,000,000,其中有8个尾随0,继续 . 乘以283,795,456乘以5 ^ 16得到43,303,750,000,000,000,000,其中只有13个尾随0 . 那个小于16,所以停止,素数因子化中2的幂是2 ^ 13 .

我希望对于更大的乘法,你实现了一个n log n算法来乘以n位数,但即使你不是,这种技术应该优于任何涉及典型大数的除法 .

让我们看一下各种算法的平均时间复杂度,假设每个n位数字的可能性相同 .

两个n位数的加法或减法需要θ(n)步 .

将n位数除以像5这样的小数字需要theta(n)步 . 除以基数是O(1) .

将n位数除以另一个大数,使用FFT得到theta(n log n)步,或者通过朴素算法得到theta(n ^ 2) . 乘法也是如此 .

将基数10重复除以2的算法的平均情况时间复杂度为 theta(n) :第一次除法需要theta(n)时间,平均而言,只需要进行O(1)次除法 .

计算具有至少n个数字的2的大功率通过重复平方获得θ(n log n),或者通过简单乘法获得θ(n ^ 2) . 以这种方式执行Euclid 's algorithm to compute the GCD takes an average of theta(n) steps. Although divisions take theta(n log n) time, most of the steps can be done as repeated subtractions and it takes only theta(n) time to do those. It takes O(n^2 log log n) to perform Euclid' s算法 . 其他改进可能会将其降低到 theta(n^2) .

在执行更昂贵的计算之前,检查最后一位数字的可除性2或5是好的,但它只会导致因子不断改进 . 在此之后应用原始算法仍然平均需要 theta(n) 步 .

通过2 ^ d或5 ^ d检查最后d个数字的可除性是O(d ^ 2)时间,O(d log d)与FFT . 当d很小时,我们很可能只需要这样做 . 可被2 ^ d整除的n位数的分数是1/2 ^ d . 因此,在这些检查上花费的平均时间是O(sum(d ^ 2/2 ^ d)),并且该和与n无关,因此平均需要 theta(1) 时间 . 当您使用最后的数字来检查可分性时,通常不必对接近n位的数字进行任何操作 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值