Let , , and be real numbers with and . Recall that the ``log to the base '' function characterized by
We use the function in algebra to solve the following problem: Given a base and a power of , find an exponent such that
That is, given and , find .
sage: log(19683.0) 9.88751059801299 sage: log(3.0) 1.09861228866811 sage: log(19683.0) / log(3.0) 9.00000000000000SAGE can quickly compute a numerical approximation for , for any , by computing a partial sum of an appropriate rapidly-converging infinite series (at least for in a certain range).
The discrete log problem is the analogue of computing but where both and are elements of a finite group.
As far as we know, finding discrete logarithms in when is large is ``very difficult'' in practice. Over the years, many people have been very motivated to try. For example, if Nikita's captors could efficiently solve Problem 3.1.2, then they could read the messages she exchanges with Michael. Unfortunately, we have no formal proof that computing discrete logarithms on a classical computer is difficult. Also, Peter Shor [#!shor!#] showed that if one could build a sufficiently complicated quantum computer, it could solve the discrete logarithm problem in time bounded by a polynomial function of the number of digits of .
It is easy to give an inefficient algorithm that solves the discrete log problem. Simply try , , , etc., until we find an exponent such that . For example, suppose , , and . Working modulo we have
so . When is large, computing the discrete log this way soon becomes impractical, because increasing the number of digits of the modulus makes the computation take vastly longer.
This draws the continuous plot.
sage.: show(plot(log, 0.1,10, rgbcolor=(0,0,1)))
This draws the discrete plot.
sage: p = 53 sage: R = Integers(p) sage: a = R.multiplicative_generator() sage: v = [(a^n, n) for n in range(p-1)] sage: v.sort() sage: G = plot(point(v,pointsize=50,rgbcolor=(0,0,1))) sage: H = plot(line(v,rgbcolor=(0.5,0.5,0.5))) sage.: show(G + H)
William 2007-06-01