other
(in-package "DM")
other
(local (include-book "arithmetic-5/top" :dir :system))
other
(include-book "fermat")
other
(local-in-theory (disable floor-mod-elim mod-theorem-one-b))
other
(defthm associate-property (implies (and (primep p) (integerp m) (not (zp j)) (< j p) (not (divides p m))) (equal (mod (* (associate j m p) j) p) (mod m p))) :rule-classes nil :hints (("Goal" :in-theory (enable associate) :use ((:instance mod-mod-times (n p) (a (* m (expt j (- p 2)))) (b j)) (:instance mod-mod-times (n p) (a (expt j (1- p))) (b m)) (:instance divides-leq (x p) (y j)) (:instance fermat (m j))))))
other
(defthm associate-bnds (implies (and (primep p) (integerp m) (not (zp j)) (< j p) (not (divides p m))) (and (not (zp (associate j m p))) (< (associate j m p) p))) :rule-classes (:forward-chaining) :hints (("Goal" :in-theory (enable associate) :use (associate-property (:instance divides-mod-0 (a m) (n p)) (:instance divides-leq (x p) (y j)) (:instance natp-mod-2 (m (* m (expt j (- p 2)))) (n p))))))
other
(defthm associate-is-unique (implies (and (primep p) (integerp m) (not (zp j)) (< j p) (not (divides p m)) (integerp x) (equal (mod m p) (mod (* j x) p))) (equal (associate j m p) (mod x p))) :rule-classes nil :hints (("Goal" :use (associate-bnds associate-property (:instance divides-leq (x p) (y j)) (:instance divides-mod-equal (n p) (a (* j x)) (b (* j (associate j m p)))) (:instance euclid (a j) (b (- x (associate j m p)))) (:instance divides-mod-equal (n p) (a x) (b (associate j m p)))))))
other
(defthm associate-of-associate (implies (and (primep p) (integerp m) (not (zp j)) (< j p) (not (divides p m))) (equal (associate (associate j m p) m p) (mod j p))) :hints (("Goal" :use (associate-property associate-bnds (:instance divides-leq (x p) (y j)) (:instance divides-leq (x p) (y (associate j m p))) (:instance associate-is-unique (x j) (j (associate j m p)))))))
other
(defthm associate-equal (implies (and (primep p) (integerp m) (integerp j) (not (divides p m)) (not (zp j)) (< j p) (not (zp i)) (< i p)) (equal (equal (associate j m p) (associate i m p)) (equal i j))) :hints (("Goal" :in-theory (disable associate-of-associate) :use (associate-of-associate (:instance associate-of-associate (j i))))))
other
(defthm associate-square (implies (and (primep p) (integerp m) (not (divides p m)) (not (zp j)) (< j p)) (iff (= (associate j m p) j) (= (mod (* j j) p) (mod m p)))) :rule-classes nil :hints (("Goal" :use (associate-property (:instance divides-leq (x p) (y j)) (:instance associate-is-unique (x j))))))
find-rootfunction
(defun find-root (n m p) (if (zp n) nil (if (= (mod (* n n) p) (mod m p)) n (find-root (1- n) m p))))
other
(defthm not-res-no-root-lemma (implies (and (not (find-root n m p)) (integerp m) (not (zp n)) (not (zp j)) (<= j n)) (not (equal (mod (* j j) p) (mod m p)))) :rule-classes nil)
other
(defthm not-res-no-root (implies (and (primep p) (integerp m) (not (residue m p)) (not (zp j)) (< j p)) (not (equal (mod (* j j) p) (mod m p)))) :hints (("Goal" :in-theory (enable residue) :use ((:instance not-res-no-root-lemma (n (1- p)))))))
other
(defthm not-res-no-self-associate (implies (and (primep p) (integerp m) (not (divides p m)) (not (residue m p)) (not (zp j)) (< j p)) (not (equal (associate j m p) j))) :rule-classes nil :hints (("Goal" :use (not-res-no-root associate-square))))
other
(defthm res-root1-lemma (implies (and (find-root n m p) (not (zp n))) (and (not (zp (find-root n m p))) (<= (find-root n m p) n) (equal (mod (* (find-root n m p) (find-root n m p)) p) (mod m p)))) :rule-classes nil)
other
(defthm res-root1 (implies (and (primep p) (residue m p)) (and (not (zp (root1 m p))) (< (root1 m p) p) (equal (mod (* (root1 m p) (root1 m p)) p) (mod m p)))) :rule-classes nil :hints (("Goal" :in-theory (enable residue) :use ((:instance res-root1-lemma (n (1- p)))))))
other
(defthm res-root2 (implies (and (primep p) (residue m p)) (and (not (zp (root2 m p))) (< (root2 m p) p) (equal (mod (* (root2 m p) (root2 m p)) p) (mod m p)))) :rule-classes nil :hints (("Goal" :use (res-root1 (:instance mod-mult (m (* (root1 m p) (root1 m p))) (a (- p (* 2 (root1 m p)))) (n p))))))
other
(defthm root1-root2 (implies (and (primep p) (integerp m) (residue m p)) (equal (mod (* (root1 m p) (root2 m p)) p) (mod (- m) p))) :hints (("Goal" :use (res-root1 (:instance mod-mult (n p) (m (- (* (root1 m p) (root1 m p)))) (a (root1 m p))) (:instance mod-mod-times (a (- (root1 m p))) (b (root1 m p)) (n p)) (:instance mod-times-mod (a (* (root1 m p) (root1 m p))) (b m) (c -1) (n p))))))
other
(defthm associate-roots (implies (and (primep p) (integerp m) (not (divides p m)) (residue m p)) (and (equal (associate (root1 m p) m p) (root1 m p)) (equal (associate (root2 m p) m p) (root2 m p)))) :rule-classes nil :hints (("Goal" :use (res-root1 res-root2 (:instance associate-square (j (root1 m p))) (:instance associate-square (j (root2 m p)))))))
other
(defthm only-2-roots-lemma-1 (implies (and (primep p) (integerp r) (integerp j) (= (mod (* j j) p) (mod (* r r) p))) (or (= (mod j p) (mod r p)) (= (mod j p) (mod (- r) p)))) :rule-classes nil :hints (("Goal" :use ((:instance divides-mod-equal (n p) (a (* j j)) (b (* r r))) (:instance euclid (a (- j r)) (b (+ j r))) (:instance divides-mod-equal (n p) (a j) (b r)) (:instance divides-mod-equal (n p) (a j) (b (- r)))))))
other
(defthm only-2-roots-lemma-2 (implies (and (primep p) (not (zp r)) (< r p) (not (zp j)) (< j p) (= (mod (* j j) p) (mod (* r r) p))) (or (= j r) (= j (- p r)))) :rule-classes nil :hints (("Goal" :use (only-2-roots-lemma-1 (:instance mod-mult (n p) (m (- r)) (a 1))))))
other
(defthm only-2-roots (implies (and (primep p) (integerp m) (not (divides p m)) (residue m p) (not (zp j)) (< j p) (= (associate j m p) j)) (or (= j (root1 m p)) (= j (root2 m p)))) :rule-classes nil :hints (("Goal" :use (res-root1 associate-square res-root2 (:instance only-2-roots-lemma-2 (r (root1 m p)))))))
other
(defthm roots-distinct (implies (and (primep p) (not (= p 2)) (residue m p)) (not (= (root1 m p) (root2 m p)))) :rule-classes nil :hints (("Goal" :use (res-root1 associate-bnds (:instance euclid (a 2) (b (root1 m p))) (:instance divides-leq (x p) (y 2)) (:instance divides-leq (x p) (y (root1 m p)))))))
associatesfunction
(defun associates (n m p) (if (zp n) (if (residue m p) (cons (root2 m p) (cons (root1 m p) nil)) nil) (if (member n (associates (1- n) m p)) (associates (1- n) m p) (cons (associate n m p) (cons n (associates (1- n) m p))))))
other
(defthm member-associates (implies (and (primep p) (integerp m) (not (divides p m)) (integerp n) (< n p) (not (zp j)) (< j p)) (iff (member (associate j m p) (associates n m p)) (member j (associates n m p)))) :hints (("Subgoal *1/1" :use (associate-roots)) ("Subgoal *1/1.8" :in-theory (disable associate-of-associate) :use (associate-roots associate-of-associate)) ("Subgoal *1/1.5" :in-theory (disable associate-of-associate) :use (associate-roots associate-of-associate))))
other
(defthm subset-positives-associates (subsetp (positives n) (associates n m p)))
other
(defthm member-self-associate (implies (and (primep p) (integerp m) (not (divides p m)) (not (zp j)) (< j p) (equal (associate j m p) j)) (member j (associates n m p))) :hints (("Subgoal *1/2" :use not-res-no-self-associate) ("Subgoal *1/1" :use only-2-roots)))
other
(defthm distinct-positives-associates-lemma (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m)) (integerp n) (< n p)) (distinct-positives (associates n m p) (1- p))) :rule-classes nil :hints (("Subgoal *1/1" :use (res-root1 res-root2 roots-distinct))))
other
(defthm distinct-positives-associates (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m))) (distinct-positives (associates (1- p) m p) (1- p))) :rule-classes nil :hints (("Goal" :use ((:instance distinct-positives-associates-lemma (n (1- p)))))))
ldpu-inductionfunction
(defun ldpu-induction (l n) (if (zp n) t (if (member n l) (ldpu-induction (remove1 n l) (1- n)) (ldpu-induction l (1- n)))))
other
(defthm len-distinct-positives-upper (implies (and (natp n) (distinct-positives l n)) (<= (len l) n)) :rule-classes nil :hints (("Goal" :induct (ldpu-induction l n))))
other
(defthm subsetp-remove (implies (and (subsetp m l) (not (member x m))) (subsetp m (remove1 x l))))
other
(defthm len-subsetp-positives (implies (and (natp n) (subsetp (positives n) l)) (>= (len l) n)) :rule-classes nil :hints (("Goal" :induct (ldpu-induction l n))))
other
(defthm pigeonhole-principle-2 (implies (and (natp n) (distinct-positives l n) (subsetp (positives n) l)) (perm (positives n) l)) :rule-classes nil :hints (("Goal" :use (pigeonhole-principle len-subsetp-positives len-distinct-positives-upper))))
other
(defthm perm-associates-positives (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m))) (perm (positives (1- p)) (associates (1- p) m p))) :rule-classes nil :hints (("Goal" :use (distinct-positives-associates (:instance pigeonhole-principle-2 (n (1- p)) (l (associates (1- p) m p)))))))
other
(defthm times-list-associates-fact (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m))) (equal (times-list (associates (1- p) m p)) (fact (1- p)))) :rule-classes nil :hints (("Goal" :use (perm-associates-positives (:instance perm-times-list (l2 (associates (1- p) m p)) (l1 (positives (1- p))))))))
other
(defthm len-associates (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m))) (equal (len (associates (+ -1 p) m p)) (1- p))) :hints (("Goal" :use (perm-associates-positives (:instance perm-len (l2 (associates (1- p) m p)) (l1 (positives (1- p))))))))
other
(defthm len-associates-even (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m)) (integerp n) (< n p)) (integerp (* 1/2 (len (associates n m p))))) :rule-classes (:type-prescription) :hints (("Subgoal *1/1" :use (res-root1 res-root2 roots-distinct))))
other
(defthm times-list-associates-lemma-1 (implies (and (integerp tl) (integerp s) (integerp m) (integerp b) (natp l) (not (zp n)) (= (mod tl n) (mod (* s (expt m l)) n)) (= (mod b n) (mod m n))) (= (mod (* tl b) n) (mod (* s (expt m (1+ l))) n))) :rule-classes nil :hints (("Goal" :use ((:instance mod-mod-times (a tl) (b b) (n n)) (:instance mod-mod-times (a (* s (expt m l))) (b b) (n n)) (:instance mod-mod-times (a b) (b (* s (expt m l))) (n n)) (:instance mod-mod-times (a m) (b (* s (expt m l))) (n n))))))
other
(defthm times-list-associates-lemma-2 (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m)) (not (zp n)) (< n p) (not (member n (associates (1- n) m p))) (equal (mod (times-list (associates (+ -1 n) m p)) p) (mod (- (expt m (/ (len (associates (1- n) m p)) 2))) p))) (equal (mod (* n (associate n m p) (times-list (associates (+ -1 n) m p))) p) (mod (- (expt m (/ (len (associates n m p)) 2))) p))) :hints (("Goal" :use ((:instance times-list-associates-lemma-1 (tl (times-list (associates (+ -1 n) m p))) (s -1) (b (* n (associate n m p))) (l (/ (len (associates (1- n) m p)) 2)) (n p)) (:instance associate-property (j n)) (:instance associate-bnds (j n))))))
other
(defthm times-list-associates-lemma-3 (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m)) (not (zp n)) (< n p) (not (member n (associates (1- n) m p))) (equal (mod (times-list (associates (+ -1 n) m p)) p) (mod (expt m (/ (len (associates (1- n) m p)) 2)) p))) (equal (mod (* n (associate n m p) (times-list (associates (+ -1 n) m p))) p) (mod (expt m (/ (len (associates n m p)) 2)) p))) :hints (("Goal" :use ((:instance times-list-associates-lemma-1 (tl (times-list (associates (+ -1 n) m p))) (s 1) (b (* n (associate n m p))) (l (/ (len (associates (1- n) m p)) 2)) (n p)) (:instance associate-property (j n)) (:instance associate-bnds (j n))))))
other
(defthm first-power (implies (integerp m) (equal (expt m 1) m)) :hints (("Goal" :expand ((expt m 1)))))
other
(local-defthmd hack-1 (implies (and (integerp m) (natp n)) (equal (expt m (+ 1 n)) (* m (expt m n)))))
other
(local-defthm hack-2 (implies (and (integerp m) (natp n) (rationalp p)) (equal (* p (expt m (+ 1 n))) (* m p (expt m n)))) :rule-classes nil :hints (("Goal" :use (hack-1) :in-theory (disable |(* x (expt x n))|))))
other
(local-defthm hack-3 (implies (and (integerp m) (natp n) (rationalp p) (integerp (* p (expt m n)))) (integerp (* p (expt m (+ 1 n))))) :hints (("Goal" :use (hack-2))))
other
(defthm times-list-associates (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m)) (< n p)) (equal (mod (times-list (associates n m p)) p) (if (residue m p) (mod (- (expt m (/ (len (associates n m p)) 2))) p) (mod (expt m (/ (len (associates n m p)) 2)) p)))) :rule-classes nil :hints (("Subgoal *1/1" :use (res-root1 res-root2))))
other
(defthm euler-lemma (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m))) (equal (mod (fact (1- p)) p) (if (residue m p) (mod (- (expt m (/ (1- p) 2))) p) (mod (expt m (/ (1- p) 2)) p)))) :rule-classes nil :hints (("Goal" :use (times-list-associates-fact (:instance times-list-associates (n (1- p)))))))
other
(defthm residue-1 (implies (primep p) (residue 1 p)) :hints (("Goal" :in-theory (enable residue))))
other
(defthm power-of-1 (equal (expt 1 x) 1))
other
(defthm mod-minus-1 (implies (not (zp n)) (equal (mod -1 n) (- n 1))) :hints (("Goal" :use ((:instance mod-mult (m -1) (a 1))))))
other
(defthm wilson (implies (primep p) (equal (mod (fact (1- p)) p) (1- p))) :rule-classes nil :hints (("Goal" :use ((:instance euler-lemma (m 1)) (:instance divides-leq (x p) (y 1))))))
other
(defthm p-1-even (implies (and (primep p) (not (= p 2))) (integerp (+ -1/2 (* 1/2 p)))) :hints (("Goal" :use ((:instance primep-no-divisor (d 2)) (:instance divides-mod-0 (a p) (n 2)) (:instance mod012 (m p)) (:instance mod-equal-int (a p) (b 1) (n 2))))))
other
(defthm euler-criterion (implies (and (primep p) (not (= p 2)) (integerp m) (not (divides p m))) (equal (mod (expt m (/ (1- p) 2)) p) (if (residue m p) 1 (1- p)))) :rule-classes nil :hints (("Goal" :in-theory (disable p-1-even) :use (euler-lemma p-1-even wilson (:instance mod-times-mod (a (- (expt m (/ (1- p) 2)))) (b -1) (c -1) (n p))))))
other
(defthm evenp-oddp (implies (integerp m) (iff (evenp m) (oddp (1+ m)))) :rule-classes nil :hints (("Goal" :use ((:instance mod012 (m (1+ m))) (:instance mod-equal-int (a (1+ m)) (b 0) (n 2)) (:instance mod-equal-int (a (1+ m)) (b 1) (n 2))))))
other
(defthm expt-minus-1 (implies (natp n) (equal (expt -1 n) (if (evenp n) 1 -1))) :hints (("Goal" :induct (positives n)) ("Subgoal *1/2" :use ((:instance evenp-oddp (m (1- n)))))))
other
(defthm first-supplement (implies (and (primep p) (not (= p 2))) (iff (residue -1 p) (= (mod p 4) 1))) :rule-classes nil :hints (("Goal" :use ((:instance expt-minus-1 (n (/ (1- p) 2))) (:instance euler-criterion (m -1)) (:instance divides-leq (x p) (y 1)) (:instance divides-minus (x p) (y -1)) (:instance mod-equal-int (a p) (b 1) (n 4)) (:instance mod-equal-int-reverse (a p) (b 1) (n 4))))))