在 Python 中查找正数 M,使得 gcd(N^M, N&M) 最大


假设我们有一个数字 N,我们必须找到一个正数 M,使得 gcd(N^M, N&M) 尽可能大,并且 m < n。我们还将返回获得的最大 gcd。

因此,如果输入是 20,则输出将是 31

为了解决这个问题,我们将遵循以下步骤:

  • 如果 bit_count(n) 等于 0,则
    • 对于 i 从 2 到 int(n 的平方根) + 1,执行以下操作:
      • 如果 n mod i 等于 0,则
        • 返回 int(n / i)
  • 否则,
    • val := 0
    • p :=
    • dupn := n
    • 当 n 不为零时,执行以下操作:
      • 如果 (n AND 1) 等于 0,则
        • val := val + p
      • p := p * 2
      • n := n >> 1
    • 返回 gcd(val XOR dupn, val AND dupn)
  • 返回 1

示例

让我们看看下面的实现以更好地理解:

from math import gcd, sqrt
def bit_count(n):
   if (n == 0):
      return 0
   else:
      return (((n & 1) == 0) + bit_count(n >> 1))
def maximum_gcd(n):
   if (bit_count(n) == 0):
      for i in range(2, int(sqrt(n)) + 1):
         if (n % i == 0):
            return int(n / i)
   else:
      val = 0
      p = 1
      dupn = n
      while (n):
         if ((n & 1) == 0):
            val += p
         p = p * 2
         n = n >> 1
      return gcd(val ^ dupn, val & dupn)
   return 1
n = 20
print(maximum_gcd(n))

输入

20

输出

31

更新于:2020年8月28日

81 次查看

开启您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.