Вычисление по квадрату:
Давайте рассмотрим пример.Вы хотите найти 17 23 .Обратите внимание, что 23 - это 10111
в двоичном виде.Давайте попробуем построить его слева направо.
// a exponent in binary
a = 17 //17^1 1
a = a * a //17^2 10
a = a * a //17^4 100
a = a * 17 //17^5 101
a = a * a //17^10 1010
a = a * 17 //17^11 1011
a = a * a //17^22 10110
a = a * 17 //17^23 10111
Когда вы возводите квадрат в квадрат, вы удваиваете показатель степени (сдвиг влево на 1 бит).Когда вы умножаете на m, вы добавляете 1 к показателю степени.
Если вы хотите уменьшить по модулю n
, вы можете сделать это после каждого умножения (вместо того, чтобы оставить его до конца, что бы сделать числаочень большой).
65537 - это 10000000000000001
в двоичном формате, что делает все это довольно простым.Это в основном
a = m
repeat 16 times:
a = a * a
a = a mod n
a = a * m
a = a mod n
, где, конечно, a, n и m являются "большими целыми числами".Значение a должно быть не менее 2048 бит, поскольку оно может достигать (n-1) 2 .