lemma finite_range_plus: assumes"finite (range f)" "finite (range g)" shows"finite (range (λx. f x + g x))" proof - have subs: "range (λx. (f x, g x)) ⊆ range f × range g"by auto have cart: "finite (range f × range g)"using assms by auto have finite: "finite (range (λx. (f x, g x)))" using rev_finite_subset[OF cart subs] . have"range (λx. f x + g x) = (λ(a,b). a+b) ` range (λx. (f x, g x))" using range_composition[of "(λ(a,b). a+b)""(λx. (f x, g x))"] by auto thenshow ?thesis using finite finite_image_set[where f = "(λ(a,b). a+b)"] by auto qed
lemma all_impl_Max: assumes"∀x. f x ≥ (a::int)" "finite (range f)" shows"(MAX x. f x) ≥ a" by (simp add: Max_ge_iff assms(1) assms(2))
lemma Max_mono': assumes"∀x. f x ≤ g x" "finite (range f)" "finite (range g)" shows"(MAX x. f x) ≤ (MAX x. g x)" using assms by (metis (no_types, lifting) Max_ge_iff Max_in UNIV_not_empty
image_is_empty rangeE rangeI)
lemma Max_mono_plus: assumes"finite (range (f::_==>_::ordered_ab_semigroup_add))" "finite (range g)" shows"(MAX x. f x + g x) ≤ (MAX x. f x) + (MAX x. g x)" proof - obtain xmax where xmax_def: "f xmax + g xmax = (MAX x. f x + g x)" using finite_range_plus[OF assms] Max_in by fastforce have"(MAX x. f x + g x) = f xmax + g xmax"using xmax_def by auto alsohave"…≤ (MAX x. f x) + g xmax" using Max_ge[OF assms(1), of "f xmax"] by (auto simp add: add_right_mono[of "f xmax"]) alsohave"…≤ (MAX x. f x) + (MAX x. g x)" using Max_ge[OF assms(2), of "g xmax"] by (auto simp add: add_left_mono[of "g xmax"]) finallyshow ?thesis by auto qed
text‹Lemmas for porting to ‹qr›.›
lemma of_qr_mult: "of_qr (a * b) = of_qr a * of_qr b mod qr_poly" by (metis of_qr_to_qr to_qr_mult to_qr_of_qr)
lemma of_qr_scale: "of_qr (to_module s * b) = Polynomial.smult (of_int_mod_ring s) (of_qr b)" unfolding to_module_def by (auto simp add: of_qr_mult[of "to_qr [:of_int_mod_ring s:]""b"]
of_qr_to_qr) (simp add: mod_mult_left_eq mod_smult_left of_qr.rep_eq)
lemma to_module_mult: "poly.coeff (of_qr (to_module s * a)) x1 = of_int_mod_ring (s) * poly.coeff (of_qr a) x1" using of_qr_scale[of s a] by simp
text‹Lemmas on ‹round› and ‹floor›.› lemma odd_round_up: assumes"odd x" shows"round (real_of_int x / 2) = (x + 1) div 2" proof - from assms have‹odd (x + 2)› by simp thenhave‹⌊real_of_int (x + 2) / 2⌋ = (x + 2 - 1) div 2› by (rule odd_half_floor) from this [symmetric] show ?thesis by (simp add: round_def ac_simps) linarith qed
lemma floor_unique: assumes"real_of_int a ≤ x""x < a+1" shows"floor x = a" using assms(1) assms(2) by linarith
lemma same_floor: assumes"real_of_int a ≤ x""real_of_int a ≤ y" "x < a+1""y < a+1" shows"floor x = floor y" using assms floor_unique by presburger
lemma one_mod_four_round: assumes"x mod 4 = 1" shows"round (real_of_int x / 4) = (x-1) div 4" proof - have leq: "(x-1) div 4 ≤ real_of_int x / 4 + 1 / 2" using assms by linarith have gr: "real_of_int x / 4 + 1 / 2 < (x-1) div 4 + 1" proof - have"x+2 < 4 * ((x-1) div 4 + 1)" proof - have *: "(x-1) div 4 + 1 = (x+3) div 4"by auto have"4 dvd x + 3"using assms by presburger thenhave"4 * ((x+3) div 4) = x+3" by (subst dvd_imp_mult_div_cancel_left, auto) thenshow ?thesis unfolding * by auto qed thenshow ?thesis by auto qed show"round (real_of_int x / 4) = (x-1) div 4" using floor_unique[OF leq gr] unfolding round_def by auto qed
section‹Re-centered "Norm" Function›
context module_spec begin text‹We want to show that ‹abs_infty_q› is a function induced by the
Euclidean norm on the ‹mod_ring› using a re-centered representative via ‹mod+-›.
‹abs_infty_poly› is the induced norm by ‹abs_infty_q› on polynomials over the polynomial
ring over the ‹mod_ring›.
Unfortunately this is not a norm per se, as the homogeneity only holds in
inequality, not equality. Still, it fulfils its purpose, since we only
need the triangular inequality.›
definition abs_infty_poly :: "'a qr ==> int"where "abs_infty_poly p = Max (range (abs_infty_q ∘ poly.coeff (of_qr p)))"
text‹Helping lemmas and properties of ‹Max›, ‹range› and ‹finite›.›
lemma to_int_mod_ring_range: "range (to_int_mod_ring :: 'a mod_ring ==> int) = {0 ..< q}" using CARD_a by (simp add: range_to_int_mod_ring)
lemma finite_Max: "finite (range (λxa. abs_infty_q (poly.coeff (of_qr x) xa)))" proof - have finite_range: "finite (range (λxa. (poly.coeff (of_qr x) xa)))" using MOST_coeff_eq_0[of "of_qr x"] by auto have"range (λxa. ∣to_int_mod_ring (poly.coeff (of_qr x) xa) mod+- q∣) = (λz. ∣to_int_mod_ring z mod+- q∣) ` range (poly.coeff (of_qr x))" using range_composition[of "(λz. abs (to_int_mod_ring z mod+- q))" "poly.coeff (of_qr x)"] by auto thenshow ?thesis using finite_range finite_image_set[where
f = "(λz. abs (to_int_mod_ring z) mod+- q)"] by (auto simp add: abs_infty_q_def) qed
lemma finite_Max_scale: "finite (range (λxa. abs_infty_q (of_int_mod_ring s * poly.coeff (of_qr x) xa)))" proof - have"of_int_mod_ring s * poly.coeff (of_qr x) xa = poly.coeff (of_qr (to_module s * x)) xa"for xa by (metis coeff_smult of_qr_to_qr_smult to_qr_of_qr
to_qr_smult_to_module to_module_def) thenshow ?thesis using finite_Max by presburger qed
lemma finite_Max_sum: "finite (range (λxa. abs_infty_q (poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa)))" proof - have finite_range: "finite (range (λxa. (poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa)))" using MOST_coeff_eq_0[of "of_qr x"] by auto have"range (λxa. ∣to_int_mod_ring (poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa) mod+- q∣) = (λz. ∣to_int_mod_ring z mod+- q∣) ` range (λxa. poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa)" using range_composition[of "(λz. abs (to_int_mod_ring z mod+- q))" "(λxa. poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa)"] by auto thenshow ?thesis using finite_range finite_image_set[where
f = "(λz. abs (to_int_mod_ring z) mod+- q)" ] by (auto simp add: abs_infty_q_def) qed
lemma finite_Max_sum': "finite (range (λxa. abs_infty_q (poly.coeff (of_qr x) xa) + abs_infty_q (poly.coeff (of_qr y) xa)))" proof - have finite_range_x: "finite (range (λxa. abs_infty_q (poly.coeff (of_qr x) xa)))" using finite_Max[of x] by auto have finite_range_y: "finite (range (λxa. abs_infty_q (poly.coeff (of_qr y) xa)))" using finite_Max[of y] by auto show ?thesis using finite_range_plus[OF finite_range_x finite_range_y] by auto qed
text‹Show that ‹abs_infty_q› is definite, positive and fulfils the triangle inequality.›
lemma abs_infty_q_definite: "abs_infty_q x = 0 ⟷ x = 0" proof (auto simp add: abs_infty_q_def
mod_plus_minus_zero'[OF q_gt_zero q_odd]) assume"to_int_mod_ring x mod+- q = 0" thenhave"to_int_mod_ring x mod q = 0" using mod_plus_minus_zero[of "to_int_mod_ring x" q] by auto thenhave"to_int_mod_ring x = 0" using to_int_mod_ring_range CARD_a by (metis mod_rangeE range_eqI) thenshow"x = 0"by force qed
lemma abs_infty_q_pos: "abs_infty_q x ≥ 0" by (auto simp add: abs_infty_q_def)
lemma abs_infty_q_minus: "abs_infty_q (- x) = abs_infty_q x" proof (cases "x=0") case True thenshow ?thesis by auto next case False have minus_x: "to_int_mod_ring (-x) = q - to_int_mod_ring x" proof - have"to_int_mod_ring (-x) = to_int_mod_ring (-x) mod q" by (metis CARD_a Rep_mod_ring_mod to_int_mod_ring.rep_eq) alsohave"… = (- to_int_mod_ring x) mod q" by (metis (no_types, opaque_lifting) CARD_a diff_eq_eq
mod_add_right_eq plus_mod_ring.rep_eq to_int_mod_ring.rep_eq
uminus_add_conv_diff) alsohave"… = q - to_int_mod_ring x" proof - have"- to_int_mod_ring x ∈ {-q<..<0}" using CARD_a range_to_int_mod_ring False by (smt (verit, best) Rep_mod_ring_mod greaterThanLessThan_iff
q_gt_zero to_int_mod_ring.rep_eq to_int_mod_ring_hom.eq_iff
to_int_mod_ring_hom.hom_zero zmod_trivial_iff) thenhave"q-to_int_mod_ring x∈{0<..<q}"by auto thenshow ?thesis using minus_mod_self1 mod_rangeE by (simp add: to_int_mod_ring.rep_eq zmod_zminus1_eq_if) qed finallyshow ?thesis by auto qed thenhave"∣to_int_mod_ring (- x) mod+- q∣ = ∣(q - (to_int_mod_ring x)) mod+- q∣" by auto alsohave"… = ∣ (- to_int_mod_ring x) mod+- q∣" unfolding mod_plus_minus_def by (smt (z3) mod_add_self2) alsohave"… = ∣ - (to_int_mod_ring x mod+- q)∣" using neg_mod_plus_minus[OF q_odd q_gt_zero,
of "to_int_mod_ring x"] by simp alsohave"… = ∣to_int_mod_ring x mod+- q∣"by auto finallyshow ?thesis unfolding abs_infty_q_def by auto qed
text‹Scaling only with inequality not equality! This causes a problem in proof of the
Kyber scheme. Needed to add $q\equiv 1 \mod 4$ to change proof.› lemma mod_plus_minus_leq_mod: "∣x mod+- q∣≤∣x∣" by (smt (verit, best) atLeastAtMost_iff mod_plus_minus_range_odd
mod_plus_minus_rangeE q_gt_zero q_odd)
lemma abs_infty_q_scale_pos: assumes"s≥0" shows"abs_infty_q ((of_int_mod_ring s :: 'a mod_ring) * x) ≤ ∣s∣ * (abs_infty_q x)" proof - have"∣to_int_mod_ring (of_int_mod_ring s * x) mod+- q∣ = ∣(to_int_mod_ring (of_int_mod_ring s ::'a mod_ring) * to_int_mod_ring x mod q) mod+- q∣" using to_int_mod_ring_mult[of "of_int_mod_ring s" x] by simp alsohave"… = ∣(s mod q * to_int_mod_ring x) mod+- q∣" by (simp add: CARD_a mod_plus_minus_def of_int_mod_ring.rep_eq to_int_mod_ring.rep_eq) alsohave"…≤∣s mod q∣ * ∣to_int_mod_ring x mod+- q∣" proof - have"∣s mod q * to_int_mod_ring x mod+- q∣ = ∣(s mod q mod+- q) * (to_int_mod_ring x mod+- q) mod+- q∣" using mod_plus_minus_mult by auto alsohave"…≤∣(s mod q mod+- q) * (to_int_mod_ring x mod+- q)∣" using mod_plus_minus_leq_mod by blast alsohave"…≤∣s mod q mod+- q∣ * ∣(to_int_mod_ring x mod+- q)∣" by (simp add: abs_mult) alsohave"…≤∣s mod q∣ * ∣(to_int_mod_ring x mod+- q)∣" using mod_plus_minus_leq_mod[of "s mod q"] by (simp add: mult_right_mono) finallyshow ?thesis by auto qed alsohave"…≤∣s∣ * ∣to_int_mod_ring x mod+- q∣"using assms by (simp add: mult_mono' q_gt_zero zmod_le_nonneg_dividend) finallyshow ?thesis unfolding abs_infty_q_def by auto qed
lemma abs_infty_q_scale_neg: assumes"s<0" shows"abs_infty_q ((of_int_mod_ring s :: 'a mod_ring) * x) ≤ ∣s∣ * (abs_infty_q x)" using abs_infty_q_minus abs_infty_q_scale_pos by (smt (verit, best) mult_minus_left of_int_minus of_int_of_int_mod_ring)
lemma abs_infty_q_scale: "abs_infty_q ((of_int_mod_ring s :: 'a mod_ring) * x) ≤ ∣s∣ * (abs_infty_q x)" apply (cases "s≥0") using abs_infty_q_scale_pos apply presburger using abs_infty_q_scale_neg by force
text‹Triangle inequality for ‹abs_infty_q›.›
lemma abs_infty_q_triangle_ineq: "abs_infty_q (x+y) ≤ abs_infty_q x + abs_infty_q y" proof - have"to_int_mod_ring (x + y) mod+- q = (to_int_mod_ring x + to_int_mod_ring y) mod q mod+-q" by (simp add: to_int_mod_ring_def CARD_a plus_mod_ring.rep_eq) alsohave"… = (to_int_mod_ring x + to_int_mod_ring y) mod+-q" unfolding mod_plus_minus_def by auto alsohave"… = (to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q) mod+- q" unfolding mod_plus_minus_def by (smt (verit, ccfv_threshold) minus_mod_self2 mod_add_eq) finallyhave rewrite:"to_int_mod_ring (x + y) mod+- q = (to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q) mod+- q" . thenhave"∣to_int_mod_ring (x + y) mod+- q∣ ≤∣to_int_mod_ring x mod+- q∣ + ∣to_int_mod_ring y mod+- q∣" proof (cases "(to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q) ∈ {-⌊real_of_int q/2⌋..<⌊real_of_int q/2⌋}") case True thenhave True': "to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q ∈ {- ⌊real_of_int q / 2⌋..⌊real_of_int q / 2⌋}"by auto thenhave"(to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q) mod+- q = to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q" using mod_plus_minus_rangeE[OF True' q_odd q_gt_zero] by auto thenshow ?thesis by (simp add: rewrite) next case False thenhave"∣(to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q)∣≥⌊real_of_int q /2⌋" by auto thenhave"∣(to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q)∣≥∣(to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q) mod+- q∣" using mod_plus_minus_range_odd[OF q_gt_zero q_odd,
of "(to_int_mod_ring x mod+- q + to_int_mod_ring y mod+- q)"] by auto thenshow ?thesis by (simp add: rewrite) qed thenshow ?thesis by (auto simp add: abs_infty_q_def mod_plus_minus_def) qed
text‹Show that ‹abs_infty_poly› is definite, positive and fulfils the triangle inequality.›
lemma abs_infty_poly_definite: "abs_infty_poly x = 0 ⟷ x = 0" proof (auto simp add: abs_infty_poly_def abs_infty_q_definite) assume"(MAX xa. abs_infty_q (poly.coeff (of_qr x) xa)) = 0" thenhave abs_le_zero: "abs_infty_q (poly.coeff (of_qr x) xa) ≤ 0" for xa using Max_ge[OF finite_Max[of x],
of "abs_infty_q (poly.coeff (of_qr x) xa)"] by (auto simp add: Max_ge[OF finite_Max]) have"abs_infty_q (poly.coeff (of_qr x) xa) = 0"for xa using abs_infty_q_pos[of "poly.coeff (of_qr x) xa"]
abs_le_zero[of xa] by auto thenhave"poly.coeff (of_qr x) xa = 0"for xa by (auto simp add: abs_infty_q_definite) thenshow"x = 0" using leading_coeff_0_iff of_qr_eq_0_iff by blast qed
lemma abs_infty_poly_pos: "abs_infty_poly x ≥ 0" proof (auto simp add: abs_infty_poly_def) have f_ge_zero: "∀xa. abs_infty_q (poly.coeff (of_qr x) xa) ≥ 0" by (auto simp add: abs_infty_q_pos) thenshow" 0 ≤ (MAX xa. abs_infty_q (poly.coeff (of_qr x) xa))" using all_impl_Max[OF f_ge_zero finite_Max] by auto qed
text‹Again, homogeneity is only true for inequality not necessarily equality!
Need to add $q\equiv 1\mod 4$ such that proof of crypto scheme works out.› lemma abs_infty_poly_scale: "abs_infty_poly ((to_module s) * x) ≤ (abs s) * (abs_infty_poly x)" proof - have fin1: "finite (range (λxa. abs_infty_q (of_int_mod_ring s * poly.coeff (of_qr x) xa)))" using finite_Max_scale by auto have fin2: "finite (range (λxa. ∣s∣ * abs_infty_q (poly.coeff (of_qr x) xa)))" by (metis finite_Max finite_imageI range_composition) have"abs_infty_poly (to_module s * x) = (MAX xa. abs_infty_q ((of_int_mod_ring s) * poly.coeff (of_qr x) xa))" using abs_infty_poly_def to_module_mult by (metis (mono_tags, lifting) comp_apply image_cong) alsohave"…≤ (MAX xa. ∣s∣ * abs_infty_q (poly.coeff (of_qr x) xa))" using abs_infty_q_scale fin1 fin2 by (subst Max_mono', auto) alsohave"… = ∣s∣ * abs_infty_poly x" unfolding abs_infty_poly_def comp_def using Max_scale by auto finallyshow ?thesis by blast qed
text‹Triangle inequality for ‹abs_infty_poly›.› lemma abs_infty_poly_triangle_ineq: "abs_infty_poly (x+y) ≤ abs_infty_poly x + abs_infty_poly y" proof - have"abs_infty_q (poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa) ≤ abs_infty_q (poly.coeff (of_qr x) xa) + abs_infty_q (poly.coeff (of_qr y) xa)" for xa using abs_infty_q_triangle_ineq[of "poly.coeff (of_qr x) xa""poly.coeff (of_qr y) xa"] by auto thenhave abs_q_triang: "∀xa. abs_infty_q (poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa) ≤ abs_infty_q (poly.coeff (of_qr x) xa) + abs_infty_q (poly.coeff (of_qr y) xa)" by auto have"(MAX xa. abs_infty_q (poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa)) ≤ (MAX xa. abs_infty_q (poly.coeff (of_qr x) xa) + abs_infty_q (poly.coeff (of_qr y) xa))" using Max_mono'[OF abs_q_triang finite_Max_sum finite_Max_sum'] by auto alsohave"…≤ (MAX xa. abs_infty_q (poly.coeff (of_qr x) xa)) + (MAX xb. abs_infty_q (poly.coeff (of_qr y) xb))" using Max_mono_plus[OF finite_Max[of x] finite_Max[of y]] by auto finallyhave"(MAX xa. abs_infty_q (poly.coeff (of_qr x) xa + poly.coeff (of_qr y) xa)) ≤ (MAX xa. abs_infty_q (poly.coeff (of_qr x) xa)) + (MAX xb. abs_infty_q (poly.coeff (of_qr y) xb))" by auto thenshow ?thesis by (auto simp add: abs_infty_poly_def) qed
end
text‹Estimation inequality using message bit.›
lemma(in kyber_spec) abs_infty_poly_ineq_pm_1: assumes"∃x. poly.coeff (of_qr a) x ∈ {of_int_mod_ring (-1),1}" shows"abs_infty_poly (to_module (round((real_of_int q)/2)) * a) ≥ 2 * round (real_of_int q / 4)" proof - let ?x = "to_module (round((real_of_int q)/2)) * a" obtain x1 where x1_def: "poly.coeff (of_qr a) x1 ∈ {of_int_mod_ring(-1),1}" using assms by auto have"abs_infty_poly (to_module (round((real_of_int q)/2)) * a) ≥ abs_infty_q (poly.coeff (of_qr (to_module (round (real_of_int q / 2)) * a)) x1)" unfolding abs_infty_poly_def using x1_def by (simp add: finite_Max) alsohave"abs_infty_q (poly.coeff (of_qr (to_module (round (real_of_int q / 2)) * a)) x1) = abs_infty_q (of_int_mod_ring (round (real_of_int q / 2)) * (poly.coeff (of_qr a) x1))" using to_module_mult[of "round (real_of_int q / 2)" a] by simp alsohave"… = abs_infty_q (of_int_mod_ring (round (real_of_int q / 2)))" proof -
consider "poly.coeff (of_qr a) x1=1" | "poly.coeff (of_qr a) x1 = of_int_mod_ring (-1)" using x1_def by auto thenshow ?thesis proof (cases) case2 thenshow ?thesis by (metis abs_infty_q_minus mult.right_neutral mult_minus_right
of_int_hom.hom_one of_int_minus of_int_of_int_mod_ring) qed (auto) qed alsohave"… = ∣round (real_of_int q / 2) mod+- q∣" unfolding abs_infty_q_def using to_int_mod_ring_of_int_mod_ring by (simp add: CARD_a mod_add_left_eq mod_plus_minus_def
of_int_mod_ring.rep_eq to_int_mod_ring.rep_eq) alsohave"… = ∣((q + 1) div 2) mod+- q∣" using odd_round_up[OF q_odd] by auto alsohave"… = ∣((2 * q) div 2) mod q - (q - 1) div 2∣" proof - have"(q + 1) div 2 mod q = (q + 1) div 2"using q_gt_two by auto moreoverhave"(q + 1) div 2 - q = - ((q - 1) div 2)"by (simp add: q_odd) ultimatelyshow ?thesis unfolding mod_plus_minus_def odd_half_floor[OF q_odd] by (split if_splits) simp qed alsohave"… = ∣(q-1) div 2∣"using q_odd by (subst nonzero_mult_div_cancel_left[of 2 q], simp)
(simp add: abs_div abs_minus_commute) alsohave"… = 2 * ((q-1) div 4)" proof - from q_gt_two have"(q-1) div 2 > 0"by simp thenhave"∣(q-1) div 2∣ = (q-1) div 2"by auto alsohave"… = 2 * ((q-1) div 4)" by (subst div_mult_swap) (use q_mod_4 in ‹metis dvd_minus_mod›, force) finallyshow ?thesis by blast qed alsohave"… = 2 * round (real_of_int q / 4)" unfolding odd_round_up[OF q_odd] one_mod_four_round[OF q_mod_4] by (simp add: round_def) finallyshow ?thesis unfolding abs_infty_poly_def by simp qed
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.