【问题标题】:GCD of numbers of the form 2^i-12^i-1 形式的数字的 GCD
【发布时间】:2014-02-24 20:24:01
【问题描述】:

如何获得 GCD(2^a[i]-1,2^a[j]-1) 1

from fractions import gcd
powj=pow(2,n[j])-1
powk=pow(2,n[k])-1
gcdjk=gcd(powj,powk)

会导致大数字出现问题并产生运行时错误。
除了 1 和它们自身之外没有其他因子的素数之外,我在 2^i-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

【问题讨论】:

  • @RC。我正在寻找答案作为 2^i - 1 的特例,所以它不是重复的..
  • 你能显示你得到的错误的回溯吗?
  • 对不起,网上法官不告诉,我也找不到不好的案子。
  • 这里有一个模式。 2^gcd(6,8)-1 是什么? gcd(2^6-1, 2^8-1) 是什么?
  • 这不是重复的,至少不是那个问题。

标签: python algorithm python-2.7 greatest-common-divisor


【解决方案1】:

考虑binary GCD algorithm。如果两个操作数都是 2i-1 的形式,则可以大大简化。

首先,第一步的末尾显然没有零,所以你直接进入循环。

在循环中,在减法中,您有两个形式为 2i-1 的数字,并且左侧大于右侧,因此减法只是重置y 中的低位与x 中设置的位一样多,即减法等于y &amp;= ~x。减法之后立即将 y 右移其中尾随零的数量,因此您再次获得了 2i-1 形式的数字,但 popcnt(x) 更短。

从这里应该很明显,只有长度(即指数)才是重要的,而身份
gcd(2a-1, 2b-1) = 2gcd(a, b)-1 随之而来。

【讨论】:

    【解决方案2】:

    这些数字非常小。借助 Python 的内置 bignum 处理,它们完全可以在欧几里得算法 fractions.gcd 使用的范围内:

    >>> fractions.gcd(2**50-1, 2**100-1)
    1125899906842623L
    

    您的错误来自其他地方。当您尝试遍历 10000 个元素列表中的所有数字对时,您甚至可能只是超时。有近 5000 万对这样的对。根据您获得的时间,您的算法可能太慢了。

    【讨论】:

      【解决方案3】:

      这是一种简单的方法,您可以使用 euclid 算法求解 2 的幂,而无需实际评估它们:-

      我们需要找到 a%b 来使用 GCD 的 euclids 算法求解:-

      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 又是两个负 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

      【讨论】:

        猜你喜欢
        • 2011-11-26
        • 2014-12-12
        • 2022-07-13
        • 2010-10-22
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        相关资源
        最近更新 更多