1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from math import gcd, floor
def producttree(X):
result = [X,]
while len(X) > 1:
X = [(X[i-1] * (X[i] if i < len(X) else 1)) for i in range(1, len(X)+1, 2)]
result.append(X)
return result
def batchgcd_faster(X):
prods = producttree(X)
R = prods.pop()
while prods:
X = prods.pop()
R = [R[floor(i/2)] % X[i]**2 for i in range(len(X))]
return [gcd(r//n,n) for r,n in zip(R,X)]
print(batchgcd_faster([1909, 2923, 291, 205, 989, 62, 451, 1943, 1079, 2419]))
# output: [1909, 1, 1, 41, 23, 1, 41, 1, 83, 41] |