Python 表2^i-1中数字的GCD
如何获得GCD(2^a[I]-1,2^a[j]-1)Python 表2^i-1中数字的GCD,python,algorithm,python-2.7,greatest-common-divisor,Python,Algorithm,Python 2.7,Greatest Common Divisor,如何获得GCD(2^a[I]-1,2^a[j]-1) 对于1,这些数字非常小。借助Python内置的bignum处理,它们完全可以使用欧几里德算法分数。gcd使用: >>> fractions.gcd(2**50-1, 2**100-1) 1125899906842623L 你的错误来自其他地方。当您尝试迭代10000个元素列表中的所有数字对时,甚至可能只是超时。有将近5000万对这样的情侣。取决于你得到的时间,你的算法可能太慢了。这些数字非常小。借助Python内置的big
对于1,这些数字非常小。借助Python内置的bignum处理,它们完全可以使用欧几里德算法
分数。gcd
使用:
>>> fractions.gcd(2**50-1, 2**100-1)
1125899906842623L
你的错误来自其他地方。当您尝试迭代10000个元素列表中的所有数字对时,甚至可能只是超时。有将近5000万对这样的情侣。取决于你得到的时间,你的算法可能太慢了。这些数字非常小。借助Python内置的bignum处理,它们完全可以使用欧几里德算法
分数。gcd
使用:
>>> fractions.gcd(2**50-1, 2**100-1)
1125899906842623L
你的错误来自其他地方。当您尝试迭代10000个元素列表中的所有数字对时,甚至可能只是超时。有将近5000万对这样的情侣。取决于你所用的时间,你的算法可能太慢了。考虑一下这个问题。如果两个操作数的形式均为2i-1,则可以对其进行大幅简化
首先,在第一步的末尾显然没有零,所以直接进入循环
在循环中,在减法中,有两个2i-1形式的数字,左手边比右手边大,因此减法只重置y
中设置的低位,就像x
中设置的低位一样,也就是说,减法相当于y&=~x
。减法之后紧接着将y
右移其中尾随的零的数量,因此您又有了一个形式为2i-1的数字,但popcnt(x)
更短
从这一点可以明显看出,只有长度(即指数)才有意义,而身份gcd(2a-1,2b-1)=2gcd(a,b)-1从中派生出来。考虑一下这个问题。如果两个操作数的形式均为2i-1,则可以对其进行大幅简化 首先,在第一步的末尾显然没有零,所以直接进入循环 在循环中,在减法中,有两个2i-1形式的数字,左手边比右手边大,因此减法只重置
y
中设置的低位,就像x
中设置的低位一样,也就是说,减法相当于y&=~x
。减法之后紧接着将y
右移其中尾随的零的数量,因此您又有了一个形式为2i-1的数字,但popcnt(x)
更短
从这一点可以明显看出,只有长度(即指数)才有意义,而身份gcd(2a-1,2b-1)=2gcd(a,b)-1如下所示。这里有一个简单的方法,你可以使用欧几里得算法来求解二的幂,而不需要实际计算它们:- 我们需要找到一个%b来使用GCD的欧几里德算法进行求解:- a=2^x-1 b=2^y-1 a>b 我们需要表示a=k*b+m,其中m 假设k=2^(x-y) 2^x-1=2^(x-y)*(2^y-1)+m,m=2^(x-y)-1 因此 a%b=m=2^(x-y)-1 因此m又是二减一形式的类似幂,因此我们可以 对其应用欧几里德算法 进一步分析:-
a = 2^x-1
b = 2^y-1
GCD(a,b) = F(x,y)
where
F(x,y) = x if x==y
F(x,y) = F(x-y,y) if x > y
F(x,y) = F(x,y-x) if y < x
From further analysis F(x,y) = GCD(x,y)
a=2^x-1
b=2^y-1
GCD(a,b)=F(x,y)
哪里
F(x,y)=x如果x==y
如果x>y,则F(x,y)=F(x-y,y)
如果y
参考资料:-这里有一个简单的方法,你可以使用欧几里德算法来求解二的幂,而不用实际计算它们:- 我们需要找到一个%b来使用GCD的欧几里德算法进行求解:- a=2^x-1 b=2^y-1 a>b 我们需要表示a=k*b+m,其中m 假设k=2^(x-y) 2^x-1=2^(x-y)*(2^y-1)+m,m=2^(x-y)-1 因此 a%b=m=2^(x-y)-1 因此m又是二减一形式的类似幂,因此我们可以 对其应用欧几里德算法 进一步分析:-
a = 2^x-1
b = 2^y-1
GCD(a,b) = F(x,y)
where
F(x,y) = x if x==y
F(x,y) = F(x-y,y) if x > y
F(x,y) = F(x,y-x) if y < x
From further analysis F(x,y) = GCD(x,y)
a=2^x-1
b=2^y-1
GCD(a,b)=F(x,y)
哪里
F(x,y)=x如果x==y
如果x>y,则F(x,y)=F(x-y,y)
如果y
参考资料:-@RC。我在寻找答案,因为它是2^i-1的一个特例,所以它不是一个重复的。你能显示你得到的错误的回溯吗?对不起,在线法官不会告诉我,我也找不到一个坏的案例。这里有一个模式。什么是
2^gcd(6,8)-1
?什么是gcd(2^6-1,2^8-1)?这不是重复的,至少不是那个问题。@RC。我在寻找答案,因为它是2^i-1的一个特例,所以它不是一个重复的。你能显示你得到的错误的回溯吗?对不起,在线法官不会告诉我,我也找不到一个坏的案例。这里有一个模式。什么是2^gcd(6,8)-1
?什么是gcd(2^6-1,2^8-1)?这不是重复的,至少不是那个问题。
1<=T<=20
1<=ArraySize<=10^5
1<=a[i]<=100
>>> fractions.gcd(2**50-1, 2**100-1)
1125899906842623L
a = 2^x-1
b = 2^y-1
GCD(a,b) = F(x,y)
where
F(x,y) = x if x==y
F(x,y) = F(x-y,y) if x > y
F(x,y) = F(x,y-x) if y < x
From further analysis F(x,y) = GCD(x,y)