author | wenzelm |
Tue, 12 Mar 2024 15:57:25 +0100 | |
changeset 79873 | 6c19c29ddcbe |
parent 69790 | 154cf64e403e |
permissions | -rw-r--r-- |
69790
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
1 |
(* |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
2 |
File: HOL/Number_Theory/Mod_Exp |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
3 |
Author: Manuel Eberl, TU München |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
4 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
5 |
Fast implementation of modular exponentiation and "cong" using exponentiation by squaring. |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
6 |
Includes code setup for nat and int. |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
7 |
*) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
8 |
section \<open>Fast modular exponentiation\<close> |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
9 |
theory Mod_Exp |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
10 |
imports Cong "HOL-Library.Power_By_Squaring" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
11 |
begin |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
12 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
13 |
context euclidean_semiring_cancel |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
14 |
begin |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
15 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
16 |
definition mod_exp_aux :: "'a \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> nat \<Rightarrow> 'a" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
17 |
where "mod_exp_aux m = efficient_funpow (\<lambda>x y. x * y mod m)" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
18 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
19 |
lemma mod_exp_aux_code [code]: |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
20 |
"mod_exp_aux m y x n = |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
21 |
(if n = 0 then y |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
22 |
else if n = 1 then (x * y) mod m |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
23 |
else if even n then mod_exp_aux m y ((x * x) mod m) (n div 2) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
24 |
else mod_exp_aux m ((x * y) mod m) ((x * x) mod m) (n div 2))" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
25 |
unfolding mod_exp_aux_def by (rule efficient_funpow_code) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
26 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
27 |
lemma mod_exp_aux_correct: |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
28 |
"mod_exp_aux m y x n mod m = (x ^ n * y) mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
29 |
proof - |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
30 |
have "mod_exp_aux m y x n = efficient_funpow (\<lambda>x y. x * y mod m) y x n" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
31 |
by (simp add: mod_exp_aux_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
32 |
also have "\<dots> = ((\<lambda>y. x * y mod m) ^^ n) y" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
33 |
by (rule efficient_funpow_correct) (simp add: mod_mult_left_eq mod_mult_right_eq mult_ac) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
34 |
also have "((\<lambda>y. x * y mod m) ^^ n) y mod m = (x ^ n * y) mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
35 |
proof (induction n) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
36 |
case (Suc n) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
37 |
hence "x * ((\<lambda>y. x * y mod m) ^^ n) y mod m = x * x ^ n * y mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
38 |
by (metis mod_mult_right_eq mult.assoc) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
39 |
thus ?case by auto |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
40 |
qed auto |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
41 |
finally show ?thesis . |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
42 |
qed |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
43 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
44 |
definition mod_exp :: "'a \<Rightarrow> nat \<Rightarrow> 'a \<Rightarrow> 'a" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
45 |
where "mod_exp b e m = (b ^ e) mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
46 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
47 |
lemma mod_exp_code [code]: "mod_exp b e m = mod_exp_aux m 1 b e mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
48 |
by (simp add: mod_exp_def mod_exp_aux_correct) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
49 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
50 |
end |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
51 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
52 |
(* |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
53 |
TODO: Setup here only for nat and int. Could be done for any |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
54 |
euclidean_semiring_cancel. Should it? |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
55 |
*) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
56 |
lemmas [code_abbrev] = mod_exp_def[where ?'a = nat] mod_exp_def[where ?'a = int] |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
57 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
58 |
lemma cong_power_nat_code [code_unfold]: |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
59 |
"[b ^ e = (x ::nat)] (mod m) \<longleftrightarrow> mod_exp b e m = x mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
60 |
by (simp add: mod_exp_def cong_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
61 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
62 |
lemma cong_power_int_code [code_unfold]: |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
63 |
"[b ^ e = (x ::int)] (mod m) \<longleftrightarrow> mod_exp b e m = x mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
64 |
by (simp add: mod_exp_def cong_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
65 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
66 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
67 |
text \<open> |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
68 |
The following rules allow the simplifier to evaluate @{const mod_exp} efficiently. |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
69 |
\<close> |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
70 |
lemma eval_mod_exp_aux [simp]: |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
71 |
"mod_exp_aux m y x 0 = y" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
72 |
"mod_exp_aux m y x (Suc 0) = (x * y) mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
73 |
"mod_exp_aux m y x (numeral (num.Bit0 n)) = |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
74 |
mod_exp_aux m y (x\<^sup>2 mod m) (numeral n)" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
75 |
"mod_exp_aux m y x (numeral (num.Bit1 n)) = |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
76 |
mod_exp_aux m ((x * y) mod m) (x\<^sup>2 mod m) (numeral n)" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
77 |
proof - |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
78 |
define n' where "n' = (numeral n :: nat)" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
79 |
have [simp]: "n' \<noteq> 0" by (auto simp: n'_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
80 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
81 |
show "mod_exp_aux m y x 0 = y" and "mod_exp_aux m y x (Suc 0) = (x * y) mod m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
82 |
by (simp_all add: mod_exp_aux_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
83 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
84 |
have "numeral (num.Bit0 n) = (2 * n')" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
85 |
by (subst numeral.numeral_Bit0) (simp del: arith_simps add: n'_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
86 |
also have "mod_exp_aux m y x \<dots> = mod_exp_aux m y (x^2 mod m) n'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
87 |
by (subst mod_exp_aux_code) (simp_all add: power2_eq_square) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
88 |
finally show "mod_exp_aux m y x (numeral (num.Bit0 n)) = |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
89 |
mod_exp_aux m y (x\<^sup>2 mod m) (numeral n)" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
90 |
by (simp add: n'_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
91 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
92 |
have "numeral (num.Bit1 n) = Suc (2 * n')" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
93 |
by (subst numeral.numeral_Bit1) (simp del: arith_simps add: n'_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
94 |
also have "mod_exp_aux m y x \<dots> = mod_exp_aux m ((x * y) mod m) (x^2 mod m) n'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
95 |
by (subst mod_exp_aux_code) (simp_all add: power2_eq_square) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
96 |
finally show "mod_exp_aux m y x (numeral (num.Bit1 n)) = |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
97 |
mod_exp_aux m ((x * y) mod m) (x\<^sup>2 mod m) (numeral n)" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
98 |
by (simp add: n'_def) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
99 |
qed |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
100 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
101 |
lemma eval_mod_exp [simp]: |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
102 |
"mod_exp b' 0 m' = 1 mod m'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
103 |
"mod_exp b' 1 m' = b' mod m'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
104 |
"mod_exp b' (Suc 0) m' = b' mod m'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
105 |
"mod_exp b' e' 0 = b' ^ e'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
106 |
"mod_exp b' e' 1 = 0" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
107 |
"mod_exp b' e' (Suc 0) = 0" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
108 |
"mod_exp 0 1 m' = 0" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
109 |
"mod_exp 0 (Suc 0) m' = 0" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
110 |
"mod_exp 0 (numeral e) m' = 0" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
111 |
"mod_exp 1 e' m' = 1 mod m'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
112 |
"mod_exp (Suc 0) e' m' = 1 mod m'" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
113 |
"mod_exp (numeral b) (numeral e) (numeral m) = |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
114 |
mod_exp_aux (numeral m) 1 (numeral b) (numeral e) mod numeral m" |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
115 |
by (simp_all add: mod_exp_def mod_exp_aux_correct) |
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
116 |
|
154cf64e403e
Exponentiation by squaring, fast modular exponentiation
Manuel Eberl <eberlm@in.tum.de>
parents:
diff
changeset
|
117 |
end |