Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 表2^i-1中数字的GCD_Python_Algorithm_Python 2.7_Greatest Common Divisor - Fatal编程技术网

Python 表2^i-1中数字的GCD

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

如何获得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内置的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)