gpt4 book ai didi

python - 2^i-1 形式数字的 GCD

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:36 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

从这里可以明显看出,只有长度(即指数)才是重要的,而身份
gcd(2a-1, 2b-1) = 2gcd(a, b)-1 从中得出。

关于python - 2^i-1 形式数字的 GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21967692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com