How do I specify a modular artithmetic condition such as
f1 := (b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 1 (mod 5)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 2 (mod 5)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 3 (mod 5)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 4 (mod 5));
f2 := (b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 1 (mod 7)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 2 (mod 7)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 3 (mod 7)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 4 (mod 7)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 5 (mod 7)) ∨
(b[0]*2^0 + b[1]*2^1 + b[2]*2^2 + b[3]*2^3 + b[4]*2^4 ≡ 6 (mod 7));
F := f1 ∧ f2;
in Z3 SMT Solver?
In the above example
- ≡ is modular equivalence,
- (mod p) denotes modular arithmetic relative to p,
- "+","*" denote modular arithmetic operations addition and multiplication respectively,
- ∨ is the logical-or (disjunction) and
- ∧ is the logical-and (conjunction)
- b[] is an array of bits i.e., belongs to the set {0,1}
- 2^0, 2^1, ...., 2^4 are powers of 2
Z3 C# .NET API preferred. If not, any equivalent Z3 formulation is fine.
Using Z3 .net API
Resulting output
Using z3py Z3 Python API
Resulting output
For integer rather than Boolean variables, the result is: