Karim Belabas on Thu, 23 Jan 2020 11:03:34 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Computing discrete logs mod N when I know phi(N)? |
Hello, your main problem is the definition of "discrete logarithm" in (Z/NZ)^*. This group is in general not cyclic, i.e. it is not true that all elements are of the form g^x for a *fixed* g. This is only true when N is a) 2 or an odd prime power, or b) twice a number of the previous shape. In particular your N = p*q is not of this shape and (Z/NZ)^* is not cyclic. In this general situation, znstar returns * "independent" generators g_1, ..., g_r * their orders d_1, ..., d_r (satisfying the technical condition d_r | ... | d_1 that make the (d_i) unique; i.e., g_i^d_i = 1 [ and g_i^d != 1 for any 0 < d < d_i ] and any element x in (Z/NZ)^* can be written uniquely as x = \prod_i {g_i}^{x_i} for (unique) integers 0 <= x_i < d_i; znlog returns the (x_i) [ discrete logarithm with respect to the (g_i) ]. In PARI-speak, with smaller parameters for readability: ? G = znstar(3 * 5, 1); \\ N = 3*5 => non-cyclic, we will have r > 1 ? G.gen \\ the (g_i), r = 2 in this case %2 = [7, 11] \\ mod N implicitly ? G.cyc \\ the (d_i) %3 = [4, 2] ? znlog(8, G) \\ 8 = g_1^3 * g_2^1 %4 = [3, 1]~ ? factorback(Mod(G.gen, G.mod), %) \\ quick check %5 = Mod(8, 15) Once we know the discrete logarithms of x and y wrt the g_i, it's easy to compute the order of x and y, and check whether x = y^c for some 0 <= c < ord(y) [ left as an exercise in this case, see ??matolvemod for a (very) general solution ] Cheers, K.B. * Brandon Enright [2020-01-23 00:51]: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Alright I figured out more details which I will describe below: > > On Wed, 22 Jan 2020 07:10:55 +0000 > Brandon Enright <bmenrigh@brandonenright.net> wrote: > > > > > p = > > > > 3039332125512668828764567700357785092292459210891950632595702374157691839749003 > > > > // prime q = > > > > 49812678250664513445348324781789367118153790741421464113188581126082567313365663 > > > > // prime n = p * q // this is my modulus > > > > > > > Unfortunately I'm a bit stuck using my example above. First I init > > the group with znstar(): > > > > g = znstar(n, 1); > > > > Then when I use znlog instead of getting one number back, I'm getting > > 2 in a column vector. For example with the log of 5: > > > > znlog(5, g) > > = > > [-63127347047617664945936273330073227063449799858664932302178759330922764129399588617443353900120252459589049390676980990590388726960654101199547861106561968542, > > -1]~ > > > > The log of other numbers tend to produce two large numbers, it just so > > happens that 5 produces -1 for the second number. > > > > I don't know how to interpret these results. What is the generator > > point / base / root of the log? > > > Okay I figured out that the bid structure I get out of znstar() has an > element '.gen' which is the generator. > > As best I can tell, this is the point that is the base of the log. > > So taking the discrete log of 127 via znlog: > > GP/PARI> l = znlog(127, g) > %47 = > [16315058403787806876247495072223306909217287931523476034034216154860222224253448025436446749004031827935610293025623864473472712324783463821983523799767820455, > - -27666885693580666438437181700991665481474826242004716935879091550742082595641581]~ > > And when I raise g.gen to the first number in that column vector > 163150584[...]7820455 I get -127. > > GP/PARI> n - lift(modexp(g.gen[1], l[1], n)) > %48 = 127 > > I'm not sure why I get -127 instead of 127. That's why I'm doing n - > the result. > > When I try the log of 128 instead I get 128 out directly: > > GP/PARI> l = znlog(128, g); > GP/PARI> lift(modexp(g.gen[1], l[1], n)) > %53 = 128 > > This is certainly progress! > > I still don't understand why znlog() is giving me two results back. I > also don't understand why sometimes the result is negative. > > Thanks again for the help and patience while I work though these > details! > > Brandon > > -----BEGIN PGP SIGNATURE----- > > iF0EARECAB0WIQQsPI0+tjl0LJJzd/apoY/MCyX3ggUCXijf4AAKCRCpoY/MCyX3 > giHTAKCmEuTUEkZ3WVfkHzTE/gONUwsJ9gCfXdZsnQeSp9no7xVpsyfVSgRHqYM= > =MS1E > -----END PGP SIGNATURE----- K.B. -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite de Bordeaux Fax: (+33) (0)5 40 00 21 23 351, cours de la Liberation http://www.math.u-bordeaux.fr/~kbelabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP] `