def test_random_operator(self): operator = self.operator random.seed("Tara ra ra ta") for _ in xrange(100): N = random.randint(2, self.topN) M = 2 ** N a = Integer(N) b = Integer(N) c = operator(a, b) va = random.randint(0, M - 1) vb = random.randint(0, M - 1) try: vc = operator(va, vb) % M except ZeroDivisionError: continue assign = {} assign.update(a.build_assignment(va)) assign.update(b.build_assignment(vb)) assign.update(c.build_assignment(vc)) formula = c.get_propositional_formula() self.assertNotEqual(solve(formula, assign), None, "Model is UNSAT for a={} b={} c={}\n".format(va, vb, vc)) a.make_constant(va) b.make_constant(vb) c.make_constant(vc) formula = c.get_propositional_formula() self.assertNotEqual(solve(formula), None)
def test_random_wrong_operator(self): operator = self.operator random.seed("Tara ra ra ta ta ra ra ra ta") N = 5 M = 2 ** N for _ in xrange(10): a = Integer(N) b = Integer(N) c = operator(a, b) va = random.randint(0, M - 1) vb = random.randint(0, M - 1) try: correct = operator(va, vb) % M except ZeroDivisionError: continue a.make_constant(va) b.make_constant(vb) for vc in xrange(M): if vc == correct: continue c.make_constant(vc) formula = c.get_propositional_formula() model = solve(formula) self.assertEqual(model, None, "Model is SAT for a={} b={} c={}\n".format(va, vb, vc))