From: Christoph Fuerst <ch.fuerst@gmx.at> Date: Thu, 6 Apr 2017 19:23:45 +0000 (+0200) Subject: Working version of Discrete Logarithm X-Git-Url: http://git.risc.jku.at/gitweb/?a=commitdiff_plain;h=c9cf51a7e878290f8320e777f7a6fc5ff892457a;p=cfuerst%2Fformal-numbers.git Working version of Discrete Logarithm --- diff --git a/discrete_log.txt b/discrete_log.txt index 8241d31..047ffb9 100644 --- a/discrete_log.txt +++ b/discrete_log.txt @@ -1,9 +1,11 @@ val M: â; val K: â; +val L: â; type nat = â[M]; type prime = â[K]; +type res = â[L]; pred divides(m:prime,n:prime) â âp:prime. mâ p = n; @@ -30,19 +32,19 @@ proc InvModP(a:â[K^2],p:prime): prime return ainv; } -proc discrete_log(p:prime,g:nat,a:nat,m:nat): nat +proc discrete_log(p:prime,g:nat,a:nat,m:nat): res requires p>1 ⧠isPrime(p) ⧠// p is a prime greater than 1 âb:nat. (0 < b ⧠b < p-1) â (g^b % p â 1) ⧠g^(p-1)%p = 1 ⧠// g has order p-1 0 ⤠a ⧠a < p; // a is in â¤/p⤠ensures (g^result)%p = a; { - var ret:Nat[K^2] := 0; - var A:Array[20,nat]; - var b:Array[20,nat]; + var ret:res := 0; + var A:Array[20,nat]; // Q: Is it possible to dynamically allocate?? + var b:Array[20,nat]; // Q: Is it possible to dynamically allocate?? var gim:prime := g; - A = Array[20,nat](0); - b = Array[20,nat](0); + A = Array[20,nat](0); // Q: Is it possible to dynamically allocate?? + b = Array[20,nat](0); // Q: Is it possible to dynamically allocate?? A[0] := 1; b[0] := a; @@ -53,9 +55,7 @@ proc discrete_log(p:prime,g:nat,a:nat,m:nat): nat { A[i] = A[i-1]*g%p; gim = gim*gi % p; - print A[i]; } - print gim; for var i:nat=0;i<m;i=i+1 do { @@ -63,12 +63,16 @@ proc discrete_log(p:prime,g:nat,a:nat,m:nat): nat { if A[j] = b[i] then { + // result found ret = i*m + j; + // abort loop + i = m-1; + j = m-1; } } b[i+1] = b[i]*gim % p; } - print ret; + return ret; } @@ -76,3 +80,5 @@ proc main(): () { print discrete_log(11,2,10,10); } + +