алгоритм псевдо
R = Pow (G, X) мод P
т.е.) существует один Q, который является R + P * Q = pow (G, X)
В обратном порядке, проверьте Y для всех Q от 0 до UINT32 ((MAXUINT32-R) / P),
Y = log (R + P * Q) / log (G)
и если значение Y не имеет дробей, то они являются множеством ответов "X" для вашей задачи.
Предположим, что X1 является первым значением X, которое не имеет дробей, а X2 является вторым значением X, которое не имеет дробей. Тогда множество всех X может быть задано в уравнении X (S) = X1 + (X2-X1) * S, где S = 0 до UINT32 ((MAXUINT32-X1) / (X2-X1)).
Это связано с тем, что если
1 = Pow (G, T) mod P, а затем Pow (G, X + T) mod P = Pow (G, X) mod P * Pow (G, T) mod P, который является
также Pow (G, X) mod P. Следовательно, X, X + T, X + 2T, X + 3T ... все будут иметь одинаковые значения ..