【问题标题】:Computationally efficient way to check if large number is divisible by 3检查大数是否可被3整除的计算有效方法
【发布时间】:2015-10-11 14:03:26
【问题描述】:

如果

Mp=2p-1 是素数⇒

⇒ 2p-2⋮6 或 2p⋮6 ⇒

⇒ 2p-1-1⋮3 或 2p-1⋮3 ⇒

⇒ 2n-1⋮3 或 2n⋮3, n=p-1

为了选择 p 的大值来测试 Mp 是否是素数,我相信这是一个很好的初步测试,然后再进行计算量大的 Lucas-Lehmer 测试。

但是,测试两个数字 2n-1 和 2n 是否能被 3 整除的最快、最有效的方法是什么?

我们可以从中使用的其他信息是 n 总是以 0、2、6 或 8 结尾(因为 p=n+1 是素数)。也许它在某种程度上有所帮助。

【问题讨论】:

  • PHP 有一个余数函数 '%',它来自 5%2 = 1,其中 1 是从 5 切割成 2 的余数 (2x2 = 4, 5-4 = 1, remaining is 1) 。你能用这样的东西让33033%3 = 0 = 可以被三整除吗?
  • 2^n 永远不能被 3 整除,因为根据定义它只能被 0 的 2^x 整除
  • 既然你似乎已经有了你的数字的十进制表示:一个数字可以被 3 整除,它的十进制数字之和是否可以被 3 整除。可以应用递归。

标签: algorithm performance primes division


【解决方案1】:

很容易证明:

2^n mod 3
== 1 if n is even
== 2 if n is odd

使用数学归纳法。

所以 2n 永远不能被 3 整除,当且仅当 n 是偶数时 2n-1 才能被 3 整除。

【讨论】:

  • 感谢您的回答。问题是在上述情况下 n 总是偶数(见最后一行)。
  • 好吧,看来没有问题了。你不需要计算任何东西。 n 总是偶数,所以 2^n-1 总是能被 3 整除,而 2^n 永远不会。计算效率最高的代码是您永远不必运行的代码。
【解决方案2】:

将数字相加,如果结果可被 3 整除,则它是。 一个

25681 = 2+5+6+8+3 = 24 (=2+4) = 6 是可分的。

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2010-10-25
    • 2018-02-05
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多