在 Python 中查找一个正数 M,使得 gcd(N^M,N&M) 最大
server side programmingprogrammingpython
假设我们有一个数 N,我们必须查找一个正数 M,使得 gcd(N^M, N&M) 尽可能大,并且 m < n。我们还将返回由此获得的最大 gcd。
因此,如果输入为 20,则输出为 31
要解决这个问题,我们将遵循以下步骤 −
- 如果 bit_count(n) 与 0 相同,则
- 对于范围为 2 到 int((n) 的平方根) + 1 的 i,执行
- 如果 n mod i 与 0 相同,则
- 返回 int(n / i)
- 如果 n mod i 与 0 相同,则
- 对于范围为 2 到 int((n) 的平方根) + 1 的 i,执行
- 否则,
- val := 0
- p :=
- dupn := n
- 当 n 为非零,则执行
- 如果 (n AND 1) 与 0 相同,则
- val := val + p
- p := p * 2
- n := n >> 1
- 如果 (n AND 1) 与 0 相同,则
- 返回 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