Introduction to rhythmic canons

Reexposition

Init canonCrawler

<< Musica`musica`;
canonsCyclos[n_Integer] /; PrimeQ[n] := {n}

Off[BinaryFiles::"obslt"]

(un package devenu obsolète entre les versions 5.0 et 5.1, ais ça marche qd même)

canonsCyclos[n_Integer] :=
Module[{divi,  sb},  
divi  =  Drop[Divisors[n],  1];
sb  = Drop[Subsets[divi],  1] ;
sb = Select[
     Map[  {#,  
                            Expand[Apply[Times ,  Map[cyclo ,  #]]]} &,  
                        sb],
      (* on obtient une liste d'elem de la forme
  {un subset Z,  (∏_(d  ∈  Z)) (Subscript[Φ, d])  }    *)

And[condT2[First[#]], 
                          rU01[Last[#]] ] &
];

basicForm[polyToCanon@#,  
                      n] &  /@ Last[Transpose@sb]
(* on selectionne si les indices verifient
(Subscript[T, 2])et si le polynomial est bien 0-1 *) 
];

condT2[indCyclo_] := Module[
	{prodDesA,  sA},
sA  =  Select[indCyclo,  primePowerQ];
prodDesA = 
              Flatten[Outer[Times, sA, sA]];
prodDesA = Select[prodDesA, ! primePowerQ[#] &];

subsetQ[prodDesA, 
              indCyclo]
]

fg[li_]  :=  
        Module[{m}, 
m = First[li];  
          While[MemberQ[li, m], m++]; m
]
  

(* motif est une liste triee d'entiers, commençant par 0 *)

pavePA[motif_] := Module[
{soFar = motif,  motifAugmente,  firstGap, n = 0,  
            canon = {motif},  periodikQ = {}},

intListe  =  
              Prepend[Drop[RotateLeft[motif]  -  motif,  -1],  0];
While[(firstGap = fg[soFar])  <  Last[soFar],

  

soFar  = {0}  ⋃ ( 
                        Drop[soFar,  firstGap]  -  firstGap);
n = n +  firstGap;

(* inutile de garder la partie dejà pleine *)

motifAugmente  =  motif;
While[
                    motifAugmente  ⋂  
                        soFar  ≠  {0}, 
motifAugmente  =  motif  +  motifAugmente];
soFar  =  
                    soFar  ⋃  ( motifAugmente);
AppendTo[
                    canon,  (n  +  motifAugmente)];
\(If[MemberQ[periodikQ, \ soFar], \ 
                    Print["Infini periodique !"]; 
                    Return[canon], 
				\ AppendTo[
                      periodikQ, \ soFar]\ ]\)
	] ;
canon
]

\(\(\(goWild[
        tric_]\  := 
Module[
{soFar = 
            tric, 
\ firstGap = 0, 
\ 
          onset1 = {0}, 
onset2 = {}, 
cirt\  = \ 
            Reverse[Max[tric] - tric]}, 
If[
          Inner[LessEqual\ , cirt, \ tric, \ 
            And], 
		Reverse@
            goWild[cirt], 
 (*\ 
            l' algo\ marche\ SI\ le\ motif\ est\ "gauche"\ *) 

While[
            soFar ≠ 
              Range[0, 
                Last[soFar]], 
\ \(firstGap++\); 
While[
              MemberQ[soFar, 
                firstGap], \ \(firstGap++\)]; 
Which[
              Not[MemberQ[soFar, 
                    firstGap + 
                      tric[\([2]\)]]]\  && 
\ \ \ Not[
                  MemberQ[soFar, 
                    firstGap + tric[\([3]\)]]], 
	
              AppendTo[onset1, \ firstGap]; 
	
              soFar = \ 
                soFar\  ⋃ \ \((firstGap + 
                      tric)\), 
\ \ \ \ \ Not[
                  MemberQ[soFar, 
                    firstGap + 
                      cirt[\([2]\)]]]\  && 
\ \ \ Not[
                  MemberQ[soFar, 
                    firstGap + cirt[\([3]\)]]], 
	
              AppendTo[onset2, \ firstGap]; 
	
              soFar = \ 
                soFar\  ⋃ \ \((firstGap + 
                      cirt)\), 
True, \ 
              Return[Print["problème !"], {onset1, \ 
                  onset2}]
		]
]; 
{onset1, \ 
            onset2}
]]\)\(
\)\(
\)
    \)\)
\(plotWild[
        motif_]\  := 
Module[{fitom, \ r1, \ 
          r2}, 
{r1, \ r2}\  = \ 
          goWild[motif]; 
fitom\  = \ \((Max[motif]\  - \ 
                motif\  // \ Reverse)\); 
plotCanon[
          Outer[Plus, \ r1, \ motif]\  ⋃ 
Outer[
              Plus, \ r2, \ fitom]];
	]\)

oPlus[a_,  b_]  :=  Outer[Plus,   b,  a]

Off[General::"spell1"]
\(\(Options[
          selfSimMelody] = {
	\ \ \ \ \ \ \ \ \ tempo -> 100, 
          timeUnit -> \ eighth, 
		channel -> 
            1, \ instrument -> \ 
            5};\)

\)
faireOrbites[n_,  
        p_]  := 
Union[{{0}}, 
Union /@  Table[Mod[(p^i) j,  n],  {j,  n - 1}, {i, 0, 
              n - 1}] ]

    
\(selfSimMelody[n_, \ p_, \ StHT_, \ 
        opt___] := 
Module[{orbits, nbOr, temp, \ chan\ , 
          noteLength, \ pitches, \ faitNotes}, 
	
        orbits = \ 
          Union[{{0}}, 
Union /@ \ 
              Table[Mod[p\^i\ j, \ n], \ {j, \ n - 1}, {i, 0, 
                  n - 1}]\ ]; 
\(({\ temp, \ chan, \ 
              noteLength, \ 
              instr} = \ \({\ tempo, \ channel, \ timeUnit, \ 
                  instrument} /. {opt}\) /. 
              Options[selfSimMelody])\); 

nbOr = Length@orbits; 
pitches\  = \ 
          StHT; 
While[
          Length[pitches] < nbOr, 
	
          pitches\  = \ 
            Join[pitches, \ 
              StHT]
	]; 
pitches\  = \ 
          Drop[pitches, 
            nbOr - \ Length[
                pitches]]; 

 (*\ 
          tout\ ça\ pour\ que\ pitches\ ait\ la\ même\ longueur\ que\ le\ nombre\ d' 
            orbites\ *) 

faitNotes[
            pitch_, \ onsetsList_]\  := \ 
          Module[{sol = {}}, 
If[pitch ≠ 0, 
              AppendTo[
                sol, \ \({#×noteLength, 
                      Note[pitch, noteLength, temp, \ 
                        chan]} &\)\  /@ \ 
	
                  onsetsList]]; 
	
            sol]; 

Prepend[
          Partition[
              MapThread[\ 
	
                  faitNotes, 
	{pitches, \ orbits}] // 
                Flatten, \ 
2] // 
            Sort, 
{0, 
            ProgramChange[instr, \ 
              chan]}
]\ ]\)
On[General::"spell1"]

Clear[repeter];
\(repeter[midiList_, \ n_] := 
      Module[{nbreEvts, timeUnit, i, \ \ foo}, 
foo\  = \ 
          First[Transpose[midiList]]; 
i = 
          1; 
While[\((timeUnit\  = \ 
                foo[\([i + 1]\)]\  - \ foo[\([i]\)])\) == 
            0, \ \(i++\)]; 
nbreEvts\  = \ 
          1 + Max[foo/timeUnit]; 
Union @@ 
          Table[midiList /. \ {u_, \ 
                  v_} -> \ {u\  + \((k - 1)\)*\ nbreEvts*timeUnit, \ 
                  v}, 
{k, \ 
              n}]
	]
\)
Clear[dilater];
\(dilater[midiList_, \ n_, \ opts___]\  := 
	
      Module[
\ {foo\  = \ 
            midiList}, \ 
foo /. \ {t_, \ 
              Note[seq___]} -> {n*t, \ 
              Note[seq]}
	]\)
Clear[changerInstrument];
\(changerInstrument[midiList_, \ 
        instr_] := 
\((midiList /. 
          ProgramChange[u_, \ chan_] -> \ 
            ProgramChange[instr, \ chan])\)
\)
Clear[changerChannel];
\(changerChannel[midiList_, \ 
        chan_] := 
\((midiList /. {ProgramChange[u_, \ 
                ch_] -> \ 
              ProgramChange[u, \ chan], \ 
Note[a_, \ b_, \ 
                c_, \ ch_]\  -> \ 
              Note[a, \ b, \ c, \ chan]})\)
\)
Clear[changerDuree];
changerDuree[midiList_,  
        dur_] := 
(midiList /. 
          Note[a_,  b_,  c_,  d_]  ->  
            Note[a,   dur, c,  d])

Clear[transposer];
\(transposer[mid_, \ interval_]\  := 
	
      mid /. Note[a_, \ b___] -> 
          Note[a + interval, \ 
            b]
\)
Clear[decaler];
decaler[mid_,  
        interval_]  := 
mid /. {a_,  
            b_} ->  {a + interval,  b}

ppmel[mel_]  :=  
      Module[{n, sansZero,   yeti,  height}, 
n  =  
          Max[Flatten[
              sansZero = Drop[mel,  1]]]; 
height  =  
          Length[sansZero]; 
yeti[i_,  j_]  :=  
          MemberQ[sansZero[[i]], j] /. {True -> 0,  
              False -> 1}; 
ListDensityPlot[
          Table[yeti[i, j],  {i,  height},  {j,  
              n}] , 
AspectRatio ->  height/n,  
          Ticks -> {{0, Floor[n/2],  n}, {0, 
                height}}]
]

Off[General::"spell1"];
\(\(Options[melodieToMidi] = {
	
          step -> 
            1, 	\ 
\ \ \ \ \ \ \ \ \ timbre -> \ \ \((ProgramChange[100, 
                1])\), 
\ \ \ \ \ \ \ \ \ tempo -> 
            100, 
\ \ \ \ \ \ \ \ \ basePitch -> 
            55};\)
\)
\(melodieToMidi[mel_, \ notes_, \ options___]\  := 
      Module[

{monTimbre, \ monStep, \ 
          temp, \ bp, \ 
          depart}, 
\(({monTimbre, monStep\ , \ temp, \ 
              bp} = \ \({timbre, \ step, \ tempo, \ 
                  basePitch} /. {options}\) /. 
              Options[melodieToMidi])\); 
depart\  = \ 
          Min[Flatten[
              mel]\ ]; 

Join[

{{depart, 
              TrackName["zikMu"]}}, 
{{depart, 
              TimeSignature[4, 4, 24, 8]}}, 
{{depart, \ 
              Tempo[temp*1. ]}}, 
{{depart, 
              KeySignature[0, 
                0]}}, 

{{depart, 
              monTimbre}}, 
 (*\ 
            choix\ de\ l' 
              instrument\ *) 


Map[{#[\([2]\)]*eighth, 
	
                Note[#[\([1]\)], \ sixteenth, \ temp, \ 
                  1]} &, 

Flatten[
              Map[
		Outer[List, \ {First[#]}, \ 
                    Drop[#, \ 1]] &, \ 
			MapThread[
                  Prepend, \ {mel, \ notes}]], 
\ 
              2]
], 
\ \  (*\ 
            constitution\ de\ la\ melodie\ *) 

{{\((2 + Max[Flatten@mel])\)*eighth, 
              EndOfTrack}}
	]
]
\)
On[General::"spell1"];

Procedure recog

Once a polynomial (0-1) is factored in ℤ[X], which of its irreducible factor are, or are not, a (Subscript[Φ, n]), and which ?
Each factor is submitted to recog, which 
	\[MathematicaIcon] first checks numericalluy whether all roots are on the unit circle,
	(some numeric tolerance had to be fine-tuned to the polynomial's degree)
	\[KernelIcon] IF the answer is positive, then the relevant cyclotomic polynomial (it is one, from a little known theorem) is found by meansof a straightforward iteration, the index is returned;
	\[FreakedSmiley] All this can be directly applied to an interval list i.e. a rhythmic motif, by factoring the associated polynomial and applying recog to all factors.

Coven-Meyerowitz conditions (1998)

Let A(X) be a 0-1 polynomial, 
	(Subscript[S, A]) the set of all (p^α) with (Subscript[Φ, (p^α)]) dividing A(X)
	(Subscript[R, A])  the set of all k with (Subscript[Φ, k]) dividing A(X)
	((Subscript[T, 1])): 	 A(
          1)  =  (∏_((p^k) ∈ (Subscript[S, A])))p.
	((Subscript[T, 2])): 	 \(TraditionalForm\`p\^k, 
      q\^l, … ∈ 
          S\_A\  => \(\(\(p\^k\) \(q\^l\) …\)\(\ \)\(∈\)\(\ \)\(R\_A\)\(\ \)\)\).

Thms [C-M]
	• If A tiles,  then ((Subscript[T, 1])),

	•  ((Subscript[T, 1])) + ((Subscript[T, 2])) => A tiles,

	• if the number of notes #  A  =  A(1) has at most two prime factors, then ((Subscript[T, 1])) + ((Subscript[T, 2]))  ⇔   A tiles

A few explanations

﷿ Integer A(1) is the number of notes of the motif.
•  Cyclotomic factors of polynomial A(X) taken for X = 1 give prime factors of A(1), or 1:

Lemma :
(Subscript[Φ, n])(1)  =  1, except when n is a prime power. 
In this case, 
\(TraditionalForm\`\(Φ\_\(p\^α\)\)(X) = 
        1 + X\^\(p\^\(α - 1\)\) + \ 
          X\^\(2  p\^\(α - 1\)\) + …\ X\^\(\((p - 1)\) p\^\(α - 1\)\)\) and hence (Subscript[Φ, (p^α)])(1) = p.

✶ The field generated over rationals by unit roots of order (p^α), (q^β) … contains other roots, of order (p^α)×
        (q^β)×….
⚠ Moreover, with two prime factors, one has more precisely

(Sands)
Let (Subscript[ℚ, n]) be the cyclotomic filed generated by a (n^th)root of unity.
Then   \(ℚ\_\(p\^α\)[e\^\(2\ i\ π/q\^β\)]\  = \ \(ℚ[e\^\(2\ i\ π/p\^α\), e\^\(2\ i\ π/q\^β\)]\  = \ \(ℚ[e\^\(2\ i\ π/\((\(p\^α\) q\^β)\)\)]\  = \ ℚ\_\(\(p\^α\) q\^β\)\)\)\)
Meaning the Galois group of the greatest field is the (direct) product of the groups of the smaller ones.

Sands follows with a capital lemma, stating that for such periods, in a rhythmic canon (A⊕B = (Subscript[ℤ, n])) one of factors A,  B is wholly divisible by p or q. This is the key to [C-M]'s most difficult theorem.We will soon identify this notion with reducibility.

Conservation of properties (Subscript[T, 1]),  (Subscript[T, 2])

The Conservation Principle

Thm (Amiot, 2004-2005)
All transformations seen this morning preserve conditions ((Subscript[T, 1])),  ((Subscript[T, 2])) i.e. if A(X) checks the conditions in the first place,  it does still check them after transformation.

Idea of proof:
For every species of transformation, one looks at the associated polynomial of the transformed motif, and what happened to its cyclotomic factors.

For instance, stuttering a motif comes to

A (X)  ->  (1 + X + 
            (X^2) + … (X^(k - 1))) 
        A ((X^k))

and some unprepossessing lemmas about the (Subscript[Φ, n]) allow painless conclusion. For instance,

Some Unprepossessing Lemmas (on examples)

pol[x_]  =  
        1 + (x^3) + (x^6) + (x^12) + (x^23) + (x^27) + (x^36) + (x^42) + (x^47) + 
          (x^48) + (x^51) + (x^71);

Factor[pol[x]];
(recog  /@  (List  @@  %)) // Sort

Factor[pol[(x^3)]];
recog  /@  (List  @@  %) // Sort

Factor[pol[(x^5)]]; recog  /@  (List  @@  %) // Sort

Ex: orbits under the affine group

Reminder : let us have a canon  A⊕B = (Subscript[ℤ, n]) 	if m is coprime with n, 
another canon will be  m A⊕ 
          B = (Subscript[ℤ, n]), and [C-M] conditions are preserved.
This follows from preceding techniques.  (I skip a few technicalities), 
	♣ turning A into m A means A(X) becomes A((X^m))
	♢ The roots of unit whose order divide n and which are roots of A(X) are globally invariant under this transformation (ξ ↦(ξ^m) being an automorphism of group (Subscript[μ, n]))
	♡ The (Subscript[Φ, d]),  d | n factors of A(X) are henceforth preserved, i.e. (Subscript[R, m A]) = (Subscript[R, A]), hence ((Subscript[T, 1])),  ((Subscript[T, 2])) too.
	♠ From there it is easy to check that 
		• A((X^m)) is still a 0-1 polynomial (even reduced modulo (X^n) - 1)
		• and it still tiles with B.

Consequences

Difficult to evade ((Subscript[T, 2]))

From this general result, the condition must be true for an overwhelming majority of rhythmic canons: any canon reducible to a (smaller) canon checking ((Subscript[T, 2])) must also check the same condition, and it is quite difficult to find a canon that is not reducible to a smaller one ! This also includes a recent statement from I. Laba about products of metronomes :

A metronome is a motif of genus {0,k,2k,… (m-1)k}

Characterisation :
A(X) = 1 + (X^k) + …(X^((m - 1) k))= (((X^(m k)) - 1)/((X^k) - 1)) is a product of (Subscript[Φ, d]) where
d  |  m k but d does NOT divide k.

G. Lygeti wrote a piece of music with such a canon (without any special constraint that I know of).
Also includes the cases of canons tiling without bothering to reduce modulo n (i.e. tiling a range, not a cycle), for after an old result of deBruijn On British Number Systems, such canons ARE reducible recursively by deconcatenation to the trivial canon (one voice, one  note).

Reducibility of a canon

Say a canon A⊕B = (Subscript[ℤ, n]) is reducible ⇔ it may be obtained from a smaller canon by one or another of the methods listed this morning.

For isntance, the famous Vuza canons (i.e. canons where neither A,  B admits sub-cycles) are irreducible canons in the sense of concatenation.
Notice that if there exists a canon not checking ((Subscript[T, 2])), then (if necessary reducing, or using duality) one gets down to a Vuza canon, not checking  ((Subscript[T, 2])) either. Let us stress the point:
trouble makers must (essentially) be Vuza canons.

Fuglede's conjecture

A famous conjecture linking tilings (we are tiling the line i.e. dimension 1) and Fourier series :

Ω is spectral iff  (L^2)(Ω) admits a  Hilbert base of exponentials, 
e.g. of the form \(TraditionalForm\`\(ϕ\_j\) : \ ξ ∈ ℝ\^n\  ↦ \ e\^\(i < λ\_j | \(\(ξ\)\(>\)\)\)\) . {(Subscript[λ, j])} = Λ is the spectrum of Ω.

Conjecture (Fuglede, 1974):
Ω tiles (ℝ^n) ⇔ it is spectral.

As so many fascinating conjectures, this is almost true (proved in most cases,  wrong in general, in high dimension; the first counter-example only occured in 2003).
What about rhythmic canons ? A tiles a rhythmic canon iff A + [0, 1[ tiles ℝ. The conjecture is still undecided in dimension 1, but considering the above and this result from Izabella Laba (((Subscript[T, 2]))=> spectral, 2000):

Thm (Amiot, juin 2004)
The  spectral conjecture is true in dim 1 iff it is true for all Vuza canons.

A few hitherto undecided cases are thus added. Furthermore, Vuza canons are extrememely scarce (less than 1 out of (7.10^6)and only for special periods). Better still, all of the algorithms hitherto used by musicians to construct Vuza canons automatically produce canons verifiying ((Subscript[T, 2]))… Is Fuglede's conjecture at bay ???

Would that it be: for instance, it was noticed years ago that stuttering (for instance) gives Vuza canons that are NOT produced by Vuza's algorithm (nor a fortiori F.J.'s) , e.g. some Vuza canons exists that are not produced by any known algorithm.

Raising fuzzy hopes

As mentioned this morning, all Vuza canons known today are reducible by demultiplexing :

Reminder : multiplexing
Let (Subscript[A, 1]), … (Subscript[A, k]) be several  'inner rhythms' (motifs) tiling a canon of period n with the same 'outer rhythm' B :

		\(TraditionalForm\`∀ \ 
          i = \(1  …k\ \ \ \ \ A\_i⊕B = ℤ\_n\)\)
		
Then A  =  ⋃ (k (Subscript[A, i]) + i) tiles, with outer rhythm k B.

Thm [C-M]: Any canon whence 'outer rhythm' B is divisible by some (prime) number p is the product of such a combination of smaller canons.

If the fact is general and could be proved, then Fuglede's  conjecture is over in dimension 1 !!! (at least tiling => spectral). Keeping alive the suspense, I'll sadically change the subject.

Canons modulo & Galoisian properties of finite fields

Principle

Reminder :

A canon modulo p is a rhythmic canon where on each beat is allowed a number of notes congruent to 1 mod p.

A simple case: p = 2, we allow any odd number of notes on each beat. The result is the simplest possible:

Thm (Amiot, april 2004)
For ANY (prime) p , for ANY motif, there exists a canon modulo p.

My initial motivation was mainly mathematical there: looking for local conditions for a motif to tile.
Indeed, a kind of chinese remainder theorem spells that

Thm (Amiot, 2002)
If condition ((Subscript[T, 0])) holds modulo any p (prime) then it holds in ℤ[X].

This (rather easy) condition is not equivalent to tiling for all p: in this latter case,  'outer rhythm' B may change with p !!! Indeed this is what happens for most motifs A.

Sketch of proof

It is all about polynomials. The core of the matter is the following theorem, not often mentioned in the literature. I rediscovered it while exploring the area, and could only find oine old little book of A. Warusfel for a confirmation:

Let A(X) be polynomial with coefficients in a finite field (Subscript[𝔽, q]), non vanishing in 0. Then there exists an integer n > 1 such that  		A(X)  |  (X^n) - 1        in (Subscript[𝔽, q])[X]

Essentially this holds because any root of A(X) lives in some greater finite field of same characteristic; and any element (≠0) of a finite field is of finite order

Example :
Let J(X)  =  1 + X + (X^4)in (Subscript[𝔽, 2])[X]. 
It factors in the field (Subscript[𝔽, 16]), hence all roots α of J are elements of the group \(TraditionalForm\`\(𝔽\_16\%*\)\)and hence verify (α^15) = 1.

Leaving aside a few sordid details (multiple roots — yes, (X^n) - 1 now admits multiple roots ! I have found a strange formula for the multiplicity of 1 in a 0-1 polynomial A(X), based on the digits of the p-adic expression of A(1) ) which cannot resist the secret weapon:

Lemma : with characteristic p, for any polynomial P,
		P((X^p))  =  (((P(X)))^p)

Details (for the Thomasses)

Consider an irreducible factor A(x) of P(x). It is completely decomposed in a greater field, namely (Subscript[𝔽, p])[x]/A(x). This field is finite and of characteristic p, it is a (Subscript[𝔽, q]) (indeed, q = (p^((d^°) A))). As all elements of this field verify (a^(q - 1)) = 1 and A(x) has only simple roots (a finite field is perfect) we have A(x)  |  (x^(q - 1)) - 1.
This enables to decompose all factors of P(x). But there is the question of multiple roots. Now if  A(x)  |  (x^n) - 1then we get
(((A(
              x))^k) | ((((x^n) - 
                1))^k) | ((((x^n) - 
                1))^((p^α))) for (p^α) ≥ k. But this is a power of the FROBENIUS automorphism, and \(TraditionalForm\`\(\(\ \)\(\((x\^n - 1)\)\^\(p\^α\) = \(x\^\(n . p\^α\) - 1\  = \ \ x\^m - 1\)\)\)\). By getting the LCM of such m' s for all irreducible factors of a given polynomial, we have found an exponent N with P(x)  |  (x^N) - 1. If we want P(x)  | (( (x^N) - 1)/(x - 1))then replace P with P(x) × (x - 1).

Finale, giocoso assai

From there, one easily builds for any set A (beginnning with 0) a polynomial C(X) such that

A(X) × C(X) = 1 +X + (X^2) + … (X^(n - 1)) modulo p
Objection ? Yes, there is no law compelling C to be 0-1 (except when p=2…). 
Solution: one unfolds C(X) starting with a representative of C(X) ∈ ℕ[X]:

If m > 1 then replace  m (X^k) with (m - 1) (X^k) + (X^(n + k)).

Thus C(X) is unchanged… modulo (X^n) - 1, neither is equation ((Subscript[T, 0])), and in finite time one gets a 0-1 polynomial, qed.

Back to canonical canons

Down in flames

Kolountzakis & Matolcsi wrote their paper as a refutation of a foolhardy conjecture (Lagarias & Wang, 2001) even stronger than mine. 
☹ It was stillborn, not unlike a conjecture of Tijdeman (1996) who did not know Szabò's idea….

Canon alla hungarese

Szabò's method

Szabò is a (conjectures) killer, he conjured up a twisted algorithm for building canons, refuting a conjecture of a Sands (great specialist of tilings of abelian groups). The resulting canon is
	\[MathematicaIcon] irreducible by deconcatenation — i.e. a Vuza canon
	\[MathematicaIcon] irreducible by «de-stuttering» 
	\[MathematicaIcon] irreducible by demultiplexing, contrariwise to all hitherto constructedVuza canons !
	So I'm dead. ☹

An example

This construction is guaranteed to work with rather huge periods. Szabò's demonstration is valid for values upwards of n = 30030. I found (by trial and error) a much smaller one, that still works :

A Vuza-Szabò for n=900

Pick some (Subscript[u, i]), (Subscript[v, i]) and their products :

Evaluate[Table[(Subscript[u, i]), {i, 3}]] = {2, 3, 
          5};
Evaluate[Table[(Subscript[v, i]), {i, 3}]] = {2, 3, 
          5};
Do[(Subscript[m, i]) = (Subscript[u, i]) (Subscript[v, i]), {i, 3}]
n = (Subscript[m, 1]) (Subscript[m, 2]) (Subscript[m, 3])

Compute (Subscript[g, i]) = (∏_(k ≠ i))(Subscript[u, k]) 
            (Subscript[v, k]) and sequences of their multiples {0,  (Subscript[g, i]), 
        2  (Subscript[g, i]), … ((Subscript[u, i]) - 1) (Subscript[g, i])}

Do[(Subscript[g, i]) = (n/(Subscript[m, i])), {i, 3}]
Table[(k - 1) (Subscript[g, i]), {i, 3}, {k, 
        (Subscript[u, i])}]

Adding these sequences constitutes the inner rhythm A

A = 
      Union[Flatten[
          Outer[Plus, %[[1]], %[[2]], %[[3]]]]]

We build B from the same sequences, times (Subscript[v, i]).

Table[(k - 1) (Subscript[u, i]) (Subscript[g, i]), {i, 3}, {k, 
        (Subscript[v, i])}]

B=Union[Flatten[
                Outer[Plus, %[[1]], %[[2]], %[[3]]]] mod n]

Esay to check we have a  canon :

Union@@(Outer[Plus, A, B] mod n)==Range[0, n - 1]

One must admit B is extremely simple !

basicForm(B, n)

Now we derange B : we replace all elements of the form
 k (Subscript[u, i]) (Subscript[g, i]) +  (Subscript[u, σ[i]]) 
          (Subscript[g, σ[i]]) with itself, + (Subscript[g, i]). viz :

I define a permutation (circular here, it must move at least three indexes) :

σ[i_]  :=  1  +  Mod[i + 1, 3]

Elements to be replaced are

Table[
      Mod[(k - 1) (Subscript[u, i]) (Subscript[g, i]) + (Subscript[u, σ[i]]) 
            (Subscript[g, σ[i]]), n], {i, 3}, {k, (Subscript[v, i])}]

The transformed ones are

\(Table[
      Mod[\((k - 1)\) \(g\_i\) u\_i + \ \(g\_\(\(σ[i]\)\(\ \)\)\) 
            u\_\(σ[i]\) + g\_i, \ n], 
	{i, 
        3}, {k, \ v\_i}]\)

Let's do it:

Do[x = 
        Mod[(k - 1) (Subscript[u, i]) (Subscript[g, i]) + (Subscript[u, σ[i]]) 
              (Subscript[g, σ[i]]), n]; 
B  =  
        ReplacePart[B,  x + (Subscript[g, i]),  
          Position[B,  x]], 
{i, 3}, {k,  
        (Subscript[v, i])}]
B  =  Sort[B]

Still a canon; furthermore, it is a Vuza :

Mod[Flatten[Outer[Plus, A,  B]],  n] // Sort  //  Union // 
      Length

{basicForm[B, n], basicForm[A,  n]}

vuzaQ[{6, 24, 10, 20, 30, 90, 6, 24, 60, 30, 40, 5, 15, 6, 24, 30, 30, 
        30, 66, 54, 30, 10, 20, 60, 6, 24, 30, 15, 15, 90}, {36, 36, 28, 8, 
        28, 8, 28, 28, 8, 17, 11, 8, 17, 11, 25, 11, 17, 8, 11, 17, 8, 28, 
        28, 8, 28, 8, 28, 36, 36, 331}]

Sortie MIDI :

A={0, 36, 72, 100, 108, 136, 144, 172, 200, 208, 225, 236, 
            244, 261, 272, 297, 308, 325, 333, 344, 361, 369, 397, 425, 433, 
            461, 469, 497, 533, 569};
B =  {0, 30, 60, 90, 156, 210, 240, 
          250, 270, 330, 336, 360, 390, 405, 420, 510, 516, 540, 550, 570, 
          600, 690, 696, 720, 780, 810, 850, 855, 870, 876};

ExportMIDI[
      melodieToMidi[oPlus[A, B],  Table[i,  {i,  36,  65}],  
        timbre ->  ProgramChange[109,  1],  
        tempo ->  
          244], 
"unCanonSzabo.mid"]

Conclusion

Thanks for enduring these difficult arguments. I do hope some of these methods will provide qualoity tools for today andtomorrow composers.