 , but it takes a long time to
compute
, but it takes a long time to
compute  given only
 given only  ,
,  ,
,  , and
, and  .  One way would be to
compute
.  One way would be to
compute  from knowledge of
 from knowledge of  and
 and  ; this is possible, but
appears to be ``computationally infeasible'', in the sense that it
would take too long to be practical.
; this is possible, but
appears to be ``computationally infeasible'', in the sense that it
would take too long to be practical.
Let  ,
,  , and
, and  be real numbers with
 be real numbers with
 and
 and  .
Recall that the ``log to the base
.
Recall that the ``log to the base  '' function 
characterized by
'' function 
characterized by
 if and only if
    if and only if  
We use the
 function 
in algebra to solve
the following problem:
Given a base
 function 
in algebra to solve
the following problem:
Given a base  and a power
 and a power  of
 of  ,
find an exponent
,
find an exponent  such that
 such that 
 
That is, given
 and
 and  , find
, find  .
.
 is the
 is the
 th power of
th power of  for some
 for some  . With a SAGE we quickly find
that
. With a SAGE we quickly find
that
 
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
, for
any  , by computing a partial sum of an appropriate
rapidly-converging infinite series (at least for
, by computing a partial sum of an appropriate
rapidly-converging infinite series (at least for  in a certain
range).
 in a certain
range).
The discrete log problem is the analogue of computing  but
where both
 but
where both  and
 and  are elements of a finite group.
 are elements of a finite group.
 be a finite group, e.g.,
 be a finite group, e.g., 
 .  Given
.  Given  and
a power
 and
a power  of
 of  , find a positive integer
, find a positive integer  such that
 such that
 .
.  
As far as we know, finding discrete logarithms in 
 when
 
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
 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
, etc., until we find an
exponent  such that
 such that  .  For example, suppose
.  For example, suppose  ,
,  ,
and
,
and  .  Working modulo
.  Working modulo  we have
 we have
 
so
 .
When
.
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.
 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.
 bounces around at
random.  We illustrate this exotic behavior in Figure 3.2.
 bounces around at
random.  We illustrate this exotic behavior in Figure 3.2.
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