#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Fichero: logaritmo.py
# Autor: César Aguilera
# Fecha: Abril 2012
#
from aritmetica_modular import logaritmo_discreto

print "\n##################################################"
print "############### Logaritmo Discreto ###############"
print "##################################################\n"

print "Calcula en Zp (p primo) el/los logaritmo/s de 'b' en base 'a'\n"

a = raw_input("Introduce base, a: ")
b = raw_input("Introduce exponente, b: ")
p = raw_input("Introduce módulo, p: ")

a, b, p = int(a), int(b), int(p)


print "Logaritmo discreto: ", logaritmo_discreto(a, b, p)
#
# Fichero: script-pruebas.py
# Autor: César Aguilera
# Fecha: Abril 2012
#

from timeit import Timer
from functools import partial
from aritmetica_modular import potencia_modular, logaritmo_discreto
from random import randint

def get_execution_time_in_seconds(function, args=(), kwargs ={}, numberOfExecTime=1):
    return round(Timer(partial(function, *args, **kwargs)).timeit(numberOfExecTime), 8) # Precision tiempo 8 decimales


mismo_num_cifras = lambda c: randint(10**(len(str(c))-1), 10**( len (str(c) ))  )

P = [52691, 843587, 4872961, 29873761, 537891269, 1547598739, 82376849239, 576382750891, 5134857695843]

A = [mismo_num_cifras(i) for i in P]
B = [mismo_num_cifras(i) for i in P]


print "%s\t%s\t%s\t%s\t%s\t%s\t%s" % ("p", "a", "b", "c", "d", "tc", "td")
for i in range(len(P)):
	a, b, p = A[i], B[i], P[i]
	c = potencia_modular(a, b, p)
	d = logaritmo_discreto(a,c,p)
	tc = get_execution_time_in_seconds(potencia_modular, (a,b,p))
	td = get_execution_time_in_seconds(logaritmo_discreto, (a,c,p))
	print "%s\t%s\t%s\t%s\t%s\t%s\t%s" % (p, a, b, c, d, tc, td)