簡體   English   中英

形式為2 ^ i-1的數字的GCD

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM