FactHacks |
RSA factorization in the real world |
|
Remainder treeGiven an integer n and a sequence X of positive integers, the remainder-tree algorithm computes n mod X[0], n mod X[1], n mod X[2], etc. For long sequences the remainder-tree algorithm is much faster than computing each remainder separately.The remainder-tree algorithm is an important subroutine in the batch-gcd algorithm. How it worksThe remainder-tree algorithm uses the product tree of X as input:
def remaindersusingproducttree(n,T):
result = [n]
for t in reversed(T):
result = [result[floor(i/2)] % t[i] for i in range(len(t))]
return result
def remainders(n,X):
return remaindersusingproducttree(n,producttree(X))
# example:
print remainders(8675309,[11,13,17,19,23])
# output: [5, 6, 5, 4, 8]
# double check:
print [8675309 % p for p in [11,13,17,19,23]]
# output: [5, 6, 5, 4, 8]
This algorithm computes
n mod X[0]
and
n mod X[1]
by first computing
n mod X[0]X[1]
and then using the identities
sage: X = [41,43,47,53]
sage: T = producttree(X); print T
[[41, 43, 47, 53], [1763, 2491], [4391633]]
sage: n = 31415926535
sage: r = [n]
sage: r = [r[floor(i/2)] % T[2][i] for i in range(len(T[2]))]; print r
[2575686]
sage: r = [r[floor(i/2)] % T[1][i] for i in range(len(T[1]))]; print r
[1706, 2483]
sage: r = [r[floor(i/2)] % T[0][i] for i in range(len(T[0]))]; print r
[25, 29, 39, 45]
sage: # double check:
sage: [n%x for x in X]
[25, 29, 39, 45]
Here 31415926535 is first reduced mod 4391633, producing 2575686;
then 2575686 is reduced mod 1763 and 2491, producing 1706 and 2483;
then 1706 is reduced mod 41 and 43, producing 25 and 29;
then 2483 is reduced mod 47 and 53, producing 39 and 45.
Version: This is version 2013.09.16 of the remainder.html web page. |