def test_cycles(): for a in helix_gen(2, 2): for b in helix_gen(2, 2): print(a.cycles()) print(b.cycles()) print(product(a, b).cycles()) print("--")
def mdc_reduce(machine): stack = [machine] while stack: m = stack.pop() if m.is_trivial(): return True m = m.md_reduce() fs = factor.factor(m) if not fs: m = m.dual() if m.is_trivial(): return True fs = factor.factor(m) if not fs: continue for a, b in fs: c = mealy.product(b, a) d = c.md_reduce() if d.is_trivial() or d.dual().is_trivial(): return True if d != c and d.dual() != c: stack.append(d) return False
def bad_facto(m): for i in range(2, m.nb_states): if m.nb_states % i != 0: continue for a in helix_gen(i, m.nb_letters): for b in helix_gen(m.nb_states // i, m.nb_letters): if product(a, b) == m: return a, b return None
def mdc_reduce(m, steps): for k in range(steps): m = m.md_reduce() if m.is_trivial(): return True, k factors = bad_facto(m) if factors is None: return False, k a, b = factors m = product(b, a) return False, steps
def test_divide(nb_states, nb_letters): while True: m1 = helix(nb_states, nb_letters) m2 = helix(nb_states, nb_letters) m = product(m1, m2) if m.bireversible(): break ma = divide_right(m, m2) print(ma) if ma == m1: print("C'EST LE BON") prod = product(ma, m2) return True # if prod == m: # return True return False
def conjecturebis(): if len(sys.argv) < 4: print("usage: {} fileA fileB fileAB".format(sys.argv[0])) sys.exit(1) max_nb_states_mass = 0 exp = 5 tot = 0 res = set() for a in read_canonics(sys.argv[1]): for b in read_canonics(sys.argv[2]): tot += 1 print("Machine", tot, end='\r') if (not mealy.product(a, b).is_md_trivial() and mealy.product(b, a).is_md_trivial()): m = mealy.product(a, b) max_nb_states_mass = max(max_nb_states_mass, mealy.mass(m, exp)[-1]) res.add(m) print("Total factorisable count {}.".format(tot)) print("AB not md-trivial and BA md-trivial {}".format(len(res))) for i, a in enumerate(read_canonics(sys.argv[3])): print("Machine", i, end='\r') if a.is_md_trivial(): max_nb_states_mass = max(max_nb_states_mass, mealy.mass(a, exp)[-1]) count_not_finite = 0 for i, a in enumerate(read_canonics(sys.argv[3])): print("Machine", i, end='\r') if (not a.is_md_trivial() and not in_iso(a, res) and mealy.mass_decide(a, max_nb_states_mass)): count_not_finite += 1 print("Not md-trivial neither mdc-trivial {}.".format(count_not_finite)) return res