[英]GCD of numbers of the form 2^i-1
如何獲得1 <= a [x] <= 100的GCD(2 ^ a [i] -1,2 ^ a [j] -1)
from fractions import gcd
powj=pow(2,n[j])-1
powk=pow(2,n[k])-1
gcdjk=gcd(powj,powk)
導致大量故障,並給出運行時錯誤。
我看不到2 ^ i-1值中的模式,除了素數除1及其本身外沒有其他因子。
i 2^i -1
--------------
1 1 = 1
2 3 = 1,3
3 7 = 1,7
4 15 = 1,3,5,15
5 31 = 1,31
6 63 = 1,3,7,9,21,63
7 127= 1,127
8 255= 1,3,5,15,17,51,85,255
編輯:僅需要解決2 ^ i-1形式的數字。 以下是代碼:
import sys
import math
from fractions import gcd
t=int(input())
for i in range(0,t):
door=0
c=int(input())
n = map(int,sys.stdin.readline().split(' '))
for j in range(0,c-1):
for k in range(j+1,c):
if( gcd(n[j],n[k]) == n[k]):
powj=pow(2,n[j])-1
powk=pow(2,n[k])-1
gcdjk=gcd(powj,powk)
if(gcdjk==powk):
door = door+1
else:
door = door-gcdjk
print (door)
輸入樣本:
2
3
10 2 3
2
3 5
約束:
1<=T<=20
1<=ArraySize<=10^5
1<=a[i]<=100
考慮二進制GCD算法 。 如果兩個操作數均為2 i -1形式,則可以大大簡化。
首先,第一步的結尾處顯然沒有零,因此直接進入循環。
在循環中,在減法中,您有兩個2 i -1形式的數字,並且左手邊比右手邊大,因此減法僅重置y
低位位數在x
設置,即減法等於y &= ~x
。 減法之后緊接着是y
向右移動尾隨零的數目,因此您再次具有2 i -1形式的數字,但popcnt(x)
較短。
由此可見,只有長度(即指數)和身份相同才重要
gcd(2 a -1,2 b -1)= 2 gcd(a,b) -1從其得出。
這些數字很小。 借助Python的內置bignum處理,它們在歐幾里得算法fractions.gcd
的范圍之內。gcd使用:
>>> fractions.gcd(2**50-1, 2**100-1)
1125899906842623L
您的錯誤來自其他地方。 當您嘗試遍歷10000個元素列表中的所有數字對時,您甚至可能只是超時。 大約有五千萬個這樣的對。 根據您獲得多少時間,您的算法可能只是太慢了。
這是您可以使用euclid的算法求解兩個冪的簡單方法,而無需實際評估它們:-
我們需要找到一個%b來解決對GCD使用euclids算法的問題:
a = 2 ^ x-1 b = 2 ^ y-1
和a> b
我們需要表達a = k * b + m,其中m <b然后a%b = m
假設k = 2 ^(xy)
2 ^ x-1 = 2 ^(xy)*(2 ^ y-1)+ m,m = 2 ^(xy)-1
於是
a%b = m = 2 ^(xy)-1
因此m再次具有2減1形式的相似冪,因此我們可以對其應用euclids算法。
進一步分析 :-
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)
參考: -GCD
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.