def szekeres_difference_set_pair(m, check=True): r""" Construct Szekeres `(2m+1,m,1)`-cyclic difference family Let `4m+3` be a prime power. Theorem 3 in [Sz69]_ contains a construction of a pair of *complementary difference sets* `A`, `B` in the subgroup `G` of the quadratic residues in `F_{4m+3}^*`. Namely `|A|=|B|=m`, `a\in A` whenever `a-1\in G`, `b\in B` whenever `b+1 \in G`. See also Theorem 2.6 in [SWW72]_ (there the formula for `B` is correct, as opposed to (4.2) in [Sz69]_, where the sign before `1` is wrong. In modern terminology, for `m>1` the sets `A` and `B` form a :func:`difference family<sage.combinat.designs.difference_family>` with parameters `(2m+1,m,1)`. I.e. each non-identity `g \in G` can be expressed uniquely as `xy^{-1}` for `x,y \in A` or `x,y \in B`. Other, specific to this construction, properties of `A` and `B` are: for `a` in `A` one has `a^{-1}` not in `A`, whereas for `b` in `B` one has `b^{-1}` in `B`. INPUT: - ``m`` (integer) -- dimension of the matrix - ``check`` (default: ``True``) -- whether to check `A` and `B` for correctness EXAMPLES:: sage: from sage.combinat.matrices.hadamard_matrix import szekeres_difference_set_pair sage: G,A,B=szekeres_difference_set_pair(6) sage: G,A,B=szekeres_difference_set_pair(7) REFERENCE: .. [Sz69] \G. Szekeres, Tournaments and Hadamard matrices, Enseignement Math. (2) 15(1969), 269-278 """ from sage.rings.finite_rings.finite_field_constructor import GF F = GF(4 * m + 3) t = F.multiplicative_generator()**2 G = F.cyclotomic_cosets(t, cosets=[F.one()])[0] sG = set(G) A = filter(lambda a: a - F.one() in sG, G) B = filter(lambda b: b + F.one() in sG, G) if check: from itertools import product, chain assert (len(A) == len(B) == m) if m > 1: assert (sG == set( [xy[0] / xy[1] for xy in chain(product(A, A), product(B, B))])) assert (all(F.one() / b + F.one() in sG for b in B)) assert (not any(F.one() / a - F.one() in sG for a in A)) return G, A, B
def szekeres_difference_set_pair(m, check=True): r""" Construct Szekeres `(2m+1,m,1)`-cyclic difference family Let `4m+3` be a prime power. Theorem 3 in [Sz69]_ contains a construction of a pair of *complementary difference sets* `A`, `B` in the subgroup `G` of the quadratic residues in `F_{4m+3}^*`. Namely `|A|=|B|=m`, `a\in A` whenever `a-1\in G`, `b\in B` whenever `b+1 \in G`. See also Theorem 2.6 in [SWW72]_ (there the formula for `B` is correct, as opposed to (4.2) in [Sz69]_, where the sign before `1` is wrong. In modern terminology, for `m>1` the sets `A` and `B` form a :func:`difference family<sage.combinat.designs.difference_family>` with parameters `(2m+1,m,1)`. I.e. each non-identity `g \in G` can be expressed uniquely as `xy^{-1}` for `x,y \in A` or `x,y \in B`. Other, specific to this construction, properties of `A` and `B` are: for `a` in `A` one has `a^{-1}` not in `A`, whereas for `b` in `B` one has `b^{-1}` in `B`. INPUT: - ``m`` (integer) -- dimension of the matrix - ``check`` (default: ``True``) -- whether to check `A` and `B` for correctness EXAMPLES:: sage: from sage.combinat.matrices.hadamard_matrix import szekeres_difference_set_pair sage: G,A,B=szekeres_difference_set_pair(6) sage: G,A,B=szekeres_difference_set_pair(7) REFERENCE: .. [Sz69] \G. Szekeres, Tournaments and Hadamard matrices, Enseignement Math. (2) 15(1969), 269-278 """ from sage.rings.finite_rings.finite_field_constructor import GF F = GF(4*m+3) t = F.multiplicative_generator()**2 G = F.cyclotomic_cosets(t, cosets=[F.one()])[0] sG = set(G) A = filter(lambda a: a-F.one() in sG, G) B = filter(lambda b: b+F.one() in sG, G) if check: from itertools import product, chain assert(len(A)==len(B)==m) if m>1: assert(sG==set([xy[0]/xy[1] for xy in chain(product(A,A), product(B,B))])) assert(all(F.one()/b+F.one() in sG for b in B)) assert(not any(F.one()/a-F.one() in sG for a in A)) return G,A,B