# Find a positive number M such that gcd(N^M,N&M) is maximum in Python

Server Side ProgrammingProgrammingPython

#### Beyond Basic Programming - Intermediate Python

Most Popular

36 Lectures 3 hours

#### C Programming from scratch- Master C Programming

Best Seller

60 Lectures 8 hours

#### C++ Programming

238 Lectures 56.5 hours

Suppose we have a number N, we have to find a positive number M such that gcd(N^M, N&M) is as large as possible and m < n. We will also return the largest gcd thus obtained.

So, if the input is like 20, then the output will be 31

To solve this, we will follow these steps −

• if bit_count(n) is same as 0, then
• for i in range 2 to int(square root of (n)) + 1, do
• if n mod i is same as 0, then
• return int(n / i)
• otherwise,
• val := 0
• p :=
• dupn := n
• while n is non-zero, do
• if (n AND 1) is same as 0, then
• val := val + p
• p := p * 2
• n := n >> 1
• return gcd(val XOR dupn, val AND dupn)
• return 1

## Example

Let us see the following implementation to get better understanding −

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))

## Input

20

## Output

31