sbv-13.1: SMT Based Verification: Symbolic Haskell theorem prover using SMT solving.
Copyright(c) Levent Erkok
LicenseBSD3
Maintainererkokl@gmail.com
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Documentation.SBV.Examples.TP.PowerMod

Description

Proofs about power and modulus. Adapted from an example by amigalemming, see http://github.com/LeventErkok/sbv/issues/744.

We also demonstrate the proof-caching features of TP.

Synopsis

Documentation

runCached :: TP a -> IO a Source #

The proofs in this module are structured so they are presented at the top-level and reused. This results in re-running the proofs over and over, as each proof has to run all its dependents. To avoid re-running proofs, we tell TP to use a proof-cache. Note that use of a proof-cache comes with the user obligation that all proofs used are uniquely named. Otherwise the results can be unsound, and SBV will indicate this possibility in its output.

power :: SInteger -> SInteger -> SInteger Source #

Power function over integers.

modAddMultiple :: TP (Proof (Forall "k" Integer -> Forall "n" Integer -> Forall "m" Integer -> SBool)) Source #

\(m > 1 \Rightarrow n + mk \equiv n \pmod{m}\)

Proof

Expand
>>> runCached modAddMultiple Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. [Proven] modAddMultiple :: Ɐk ∷ Integer → Ɐn ∷ Integer → Ɐm ∷ Integer → Bool 

modAddRight :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "m" Integer -> SBool)) Source #

\(m > 0 \Rightarrow a + b \equiv a + (b \bmod m) \pmod{m}\)

Proof

Expand
>>> runCached modAddRight Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. [Proven] modAddRight :: Ɐa ∷ Integer → Ɐb ∷ Integer → Ɐm ∷ Integer → Bool 

modAddLeft :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "m" Integer -> SBool)) Source #

\(m > 0 \Rightarrow a + b \equiv (a \bmod m) + b \pmod{m}\)

Proof

Expand
>>> runCached modAddLeft Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. [Proven] modAddLeft :: Ɐa ∷ Integer → Ɐb ∷ Integer → Ɐm ∷ Integer → Bool 

modSubRight :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "m" Integer -> SBool)) Source #

\(m > 0 \Rightarrow a - b \equiv a - (b \bmod m) \pmod{m}\)

Proof

Expand
>>> runCached modSubRight Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modSubRight Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. [Proven] modSubRight :: Ɐa ∷ Integer → Ɐb ∷ Integer → Ɐm ∷ Integer → Bool 

modMulRightNonneg :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "m" Integer -> SBool)) Source #

\(a \geq 0 \land m > 0 \Rightarrow ab \equiv a \cdot (b \bmod m) \pmod{m}\)

Proof

Expand
>>> runCached modMulRightNonneg Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Inductive lemma: modMulRightNonneg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. [Proven. Cached: modAddRight] modMulRightNonneg :: Ɐa ∷ Integer → Ɐb ∷ Integer → Ɐm ∷ Integer → Bool 

modMulRightNeg :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "m" Integer -> SBool)) Source #

\(a \geq 0 \land m > 0 \Rightarrow -ab \equiv -\left(a \cdot (b \bmod m)\right) \pmod{m}\)

Proof

Expand
>>> runCached modMulRightNeg Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Lemma: modSubRight Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Inductive lemma: modMulRightNeg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. [Proven. Cached: modAddMultiple] modMulRightNeg :: Ɐa ∷ Integer → Ɐb ∷ Integer → Ɐm ∷ Integer → Bool 

modMulRight :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "m" Integer -> SBool)) Source #

\(m > 0 \Rightarrow ab \equiv a \cdot (b \bmod m) \pmod{m}\)

Proof

Expand
>>> runCached modMulRight Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Inductive lemma: modMulRightNonneg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Lemma: modSubRight Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Inductive lemma: modMulRightNeg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: modMulRight Step: 1 (2 way case split) Step: 1.1 Q.E.D. Step: 1.2.1 Q.E.D. Step: 1.2.2 Q.E.D. Step: 1.2.3 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. [Proven. Cached: modAddLeft, modAddMultiple, modAddRight] modMulRight :: Ɐa ∷ Integer → Ɐb ∷ Integer → Ɐm ∷ Integer → Bool 

modMulLeft :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "m" Integer -> SBool)) Source #

\(m > 0 \Rightarrow ab \equiv (a \bmod m) \cdot b \pmod{m}\)

Proof

Expand
>>> runCached modMulLeft Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Inductive lemma: modMulRightNonneg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Lemma: modSubRight Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Inductive lemma: modMulRightNeg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: modMulRight Step: 1 (2 way case split) Step: 1.1 Q.E.D. Step: 1.2.1 Q.E.D. Step: 1.2.2 Q.E.D. Step: 1.2.3 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. Lemma: modMulLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. [Proven. Cached: modAddLeft, modAddMultiple, modAddRight] modMulLeft :: Ɐa ∷ Integer → Ɐb ∷ Integer → Ɐm ∷ Integer → Bool 

powerMod :: TP (Proof (Forall "b" Integer -> Forall "n" Integer -> Forall "m" Integer -> SBool)) Source #

\(n \geq 0 \land m > 0 \Rightarrow b^n \equiv (b \bmod m)^n \pmod{m}\)

Proof

Expand
>>> runCached powerMod Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Inductive lemma: modMulRightNonneg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Lemma: modSubRight Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Inductive lemma: modMulRightNeg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: modMulRight Step: 1 (2 way case split) Step: 1.1 Q.E.D. Step: 1.2.1 Q.E.D. Step: 1.2.2 Q.E.D. Step: 1.2.3 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. Lemma: modMulLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modMulRightNonneg Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modSubRight Q.E.D. Cached: modMulRightNeg Q.E.D. Cached: modMulRight Q.E.D. Inductive lemma: powerModInduct Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: powerMod Q.E.D. [Proven. Cached: modAddLeft, modAddMultiple, modAddRight, modMulRight] powerMod :: Ɐb ∷ Integer → Ɐn ∷ Integer → Ɐm ∷ Integer → Bool 

onePower :: TP (Proof (Forall "n" Integer -> SBool)) Source #

\(n \geq 0 \Rightarrow 1^n = 1\)

Proof

Expand
>>> runCached onePower Inductive lemma: onePower Step: Base Q.E.D. Step: 1 (unfold power) Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. [Proven] onePower :: Ɐn ∷ Integer → Bool 

powerOf27 :: TP (Proof (Forall "n" Integer -> SBool)) Source #

\(n \geq 0 \Rightarrow (27^n \bmod 13) = 1\)

Proof

Expand
>>> runCached powerOf27 Inductive lemma: onePower Step: Base Q.E.D. Step: 1 (unfold power) Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Inductive lemma: modMulRightNonneg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Lemma: modSubRight Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Inductive lemma: modMulRightNeg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: modMulRight Step: 1 (2 way case split) Step: 1.1 Q.E.D. Step: 1.2.1 Q.E.D. Step: 1.2.2 Q.E.D. Step: 1.2.3 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. Lemma: modMulLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modMulRightNonneg Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modSubRight Q.E.D. Cached: modMulRightNeg Q.E.D. Cached: modMulRight Q.E.D. Inductive lemma: powerModInduct Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: powerMod Q.E.D. Lemma: powerOf27 Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Result: Q.E.D. [Proven. Cached: modAddLeft, modAddMultiple, modAddRight, modMulRight] powerOf27 :: Ɐn ∷ Integer → Bool 

powerOfThreeMod13VarDivisor :: TP (Proof (Forall "n" Integer -> Forall "m" Integer -> SBool)) Source #

\(n \geq 0 \wedge m > 0 \implies (27^{\frac{n}{3}} \bmod 13) \cdot 3^{n \bmod 3} \equiv 3^{n \bmod 3} \pmod{m}\)

Proof

Expand
>>> runCached powerOfThreeMod13VarDivisor Inductive lemma: onePower Step: Base Q.E.D. Step: 1 (unfold power) Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Inductive lemma: modAddMultiple Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Lemma: modAddRight Step: 1 Q.E.D. Step: 2 Q.E.D. Result: Q.E.D. Lemma: modAddLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Inductive lemma: modMulRightNonneg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Lemma: modSubRight Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Inductive lemma: modMulRightNeg Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: modMulRight Step: 1 (2 way case split) Step: 1.1 Q.E.D. Step: 1.2.1 Q.E.D. Step: 1.2.2 Q.E.D. Step: 1.2.3 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. Lemma: modMulLeft Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Result: Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modMulRightNonneg Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modAddRight Q.E.D. Cached: modAddLeft Q.E.D. Cached: modAddMultiple Q.E.D. Cached: modSubRight Q.E.D. Cached: modMulRightNeg Q.E.D. Cached: modMulRight Q.E.D. Inductive lemma: powerModInduct Step: Base Q.E.D. Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Step: 5 Q.E.D. Step: 6 Q.E.D. Result: Q.E.D. Lemma: powerMod Q.E.D. Lemma: powerOf27 Step: 1 Q.E.D. Step: 2 Q.E.D. Step: 3 Q.E.D. Step: 4 Q.E.D. Result: Q.E.D. Lemma: powerOfThreeMod13VarDivisor Step: 1 Q.E.D. Result: Q.E.D. [Proven. Cached: modAddLeft, modAddMultiple, modAddRight, modMulRight] powerOfThreeMod13VarDivisor :: Ɐn ∷ Integer → Ɐm ∷ Integer → Bool