# GAP functions for computing a number of sequences enumerating aperiodic toroidal arrays and necklaces. # Computes coefficient array for a n X m toroidal array for counting elements with specified symmetry group. # The returned array will have nonzero entries for divisors of n*m. TorusMoebius:=function(n, m, fsel) local v, g, s, d, i; g := DirectProduct(CyclicGroup(m), CyclicGroup(n)); s := AllSubgroups(g); SortBy(s, h -> -Size(h)); d := List([1..Size(s)], i->0); v := List([1..m*n], i->0); for i in [1..Size(d)] do if fsel(s[i]) then d[i] := n*m/Order(s[i]); fi; d[i] := d[i] - Sum(List(Filtered([1..i-1], j->IsSubset(s[j], s[i])), j->d[j] )); v[Order(s[i])] := v[Order(s[i])] + d[i]; od; return v; end; # A(n,k) is the number of n X k aperiodic binary toroidal necklaces. A323861 := function(n,m) local v; if n*m = 0 then return 1; fi; v := TorusMoebius(n, m, h->Order(h)=n*m); return Sum(DivisorsInt(Size(v)), i->v[i]*2^i)/Size(v); end; # A(n,k) is the number of distinct n X k toroidal binary arrays. A184271 := function(n,m) local v; if n*m = 0 then return 1; fi; v := TorusMoebius(n, m, h->true); return Sum(DivisorsInt(Size(v)), i->v[i]*2^i)/Size(v); end; # Number of aperiodic toroidal necklaces of positive integers summing to n. A323866 := function(n) local s, v, i, j; if n = 0 then return 1; fi; s := 0; for i in [1..n] do for j in [1..QuoInt(n, i)] do v := TorusMoebius(i,j, h->Order(h)=i*j); s := s + Sum(DivisorsInt(GcdInt(n,i*j)), d->v[i*j/d]*Binomial(n/d-1, i*j/d-1))/(i*j); od; od; return s; end; # Number of aperiodic arrays of positive integers summing to n. A323867 := function(n) local s, v, i, j; if n = 0 then return 1; fi; s := 0; for i in [1..n] do for j in [1..QuoInt(n, i)] do v := TorusMoebius(i, j, h->Order(h)=i*j); s := s + Sum(DivisorsInt(GcdInt(n,i*j)), d->v[i*j/d]*Binomial(n/d-1, i*j/d-1)); od; od; return s; end; # Number of toroidal necklaces of positive integers summing to n. A323858 := function(n) local s, v, i, j; if n = 0 then return 1; fi; s := 0; for i in [1..n] do for j in [1..QuoInt(n, i)] do v := TorusMoebius(i, j, h->true); s := s + Sum(DivisorsInt(GcdInt(n,i*j)), d->v[i*j/d]*Binomial(n/d-1, i*j/d-1))/(i*j); od; od; return s; end; # Number of aperiodic matrices of size n whose entries cover an initial interval of positive integers. A323869 := function(n) local r, v, d, k, i, s; if n = 0 then return 1; fi; r := List([1..n], i->0); for d in DivisorsInt(n) do v := TorusMoebius(d, n/d, h->Order(h)=n); for k in [1..n] do r[k] := r[k] + Sum(DivisorsInt(n), i->v[i]*k^i); od; od; s := 0; for i in [1..n] do s := s + Sum([1..i], k->(-1)^(i-k)*Binomial(i, k)*r[k]); od; return s; end; # Number of aperiodic toroidal necklaces of size n whose entries cover an initial interval of positive integers. A323871 := n -> A323869(n)/n; #Number of toroidal necklaces of size n whose entries cover an initial interval of positive integers A323870 := function(n) local r, v, d, k, i, s; if n = 0 then return 1; fi; r := List([1..n], i->0); for d in DivisorsInt(n) do v := TorusMoebius(d, n/d, h->true); for k in [1..n] do r[k] := r[k] + Sum(DivisorsInt(n), i->v[i]*k^i); od; od; s := 0; for i in [1..n] do s := s + Sum([1..i], k->(-1)^(i-k)*Binomial(i, k)*r[k]); od; return s/n; end; # End