Normal forms: Difference between revisions
Cmloegcmluin (talk | contribs) →Defactored Hermite form: antinullspace → nullspace |
ArrowHead294 (talk | contribs) m Formatting |
||
| Line 1: | Line 1: | ||
Since a [[regular temperament]] can be represented by multiple equivalent [[Vals and tuning space|val]] lists (aka [[mapping]]s) or [[Monzos and interval space|monzo]] lists (aka [[comma basis|comma bases]]), it can be helpful | Since a [[regular temperament]] can be represented by multiple equivalent [[Vals and tuning space|val]] lists (aka [[mapping]]s) or [[Monzos and interval space|monzo]] lists (aka [[comma basis|comma bases]]), it can be helpful—e.g. when comparing or cataloguing temperaments—to choose a single one of these equivalent lists to use as its unique identifier. A set of rules that are consistently able to narrow the full set of equivalent lists down to a single list for each temperament may be called a ''normal form'', and accordingly, a list which uniquely identifies a temperament in this way may be called a '''normal list'''. | ||
Because several different normal forms have been developed, each temperament has several different normal lists: one for each form. These normal lists are not all necessarily different; sometimes some or all of them may be the same. | Because several different normal forms have been developed, each temperament has several different normal lists: one for each form. These normal lists are not all necessarily different; sometimes some or all of them may be the same. | ||
| Line 10: | Line 10: | ||
There are slightly different definitions of HNF in use, and if you are using a computer program to compute it, you should take care that the same normal monzo or val list is finally achieved. The definition used by the Wikipedia article on Hermite form, probably the most standard, works as follows. | There are slightly different definitions of HNF in use, and if you are using a computer program to compute it, you should take care that the same normal monzo or val list is finally achieved. The definition used by the Wikipedia article on Hermite form, probably the most standard, works as follows. | ||
An ''n'' | An ''n''×''m'' integral matrix H is in HNF if when we define a function ''F'' such that {{nowrap|''F''(''i'') {{=}} 0}} if all of the entries in the ''i''-th column of H are 0, and otherwise ''F''(''i'') is equal to the row number of the first nonzero entry in the ''i''-th column, checking up from the bottom, i.e. from the ''n''-th row, we have | ||
# If ''i'' > ''j'', H[''i'', ''j''] = 0 (H is upper triangular.) | # If {{nowrap|''i'' > ''j''}}, {{nowrap|H[''i'', ''j''] {{=}} 0}} (H is upper triangular.) | ||
# ''F'' (''i'') is a function of the column number ''i''. | # ''F''(''i'') is a function of the column number ''i''. | ||
# ''F'' (''i'') = 0 if and only if all of the entries in the ''i''-th column are 0. | # {{nowrap|''F''(''i'') {{=}} 0}} if and only if all of the entries in the ''i''-th column are 0. | ||
# ''F'' is an increasing function of the column number ''i'', and becomes strictly increasing after ''F'' (''i'') becomes positive. | # ''F'' is an increasing function of the column number ''i'', and becomes strictly increasing after ''F''(''i'') becomes positive. | ||
# If ''k'' > ''F'' (''i'') > 0 then H[''k'', ''i''] = 0; that is, ''F'' (''i'') is the row of the first nonzero entry in the ''i''-th column, counting up from the bottom. | # If {{nowrap|''k'' > ''F''(''i'') > 0}} then {{nowrap|H[''k'', ''i''] {{=}} 0}}; that is, ''F''(''i'') is the row of the first nonzero entry in the ''i''-th column, counting up from the bottom. | ||
# If ''F'' (''i'') > 0 then H[''F'' (''i''), ''i''] > 0; that is, the first nonzero entry in the ''i''-th column, counting up from the bottom, is positive. | # If {{nowrap|''F''(''i'') > 0}} then {{nowrap|H[''F''(''i''), ''i''] > 0}}; that is, the first nonzero entry in the ''i''-th column, counting up from the bottom, is positive. | ||
# If ''F'' (''i'') > 0 and ''i'' < ''j'' then H[''F'' (''i''), ''i''] > H[''F'' (''i''), ''j''] | # If {{nowrap|''F''(''i'') > 0}} and {{nowrap|''i'' < ''j''}} then {{nowrap|H[''F''(''i''), ''i''] > H[''F''(''i''), ''j''] ≥ 0}}; that is, the first nonzero entry in the ''i''-th column, counting up from the bottom, is greater than any of the rest along that row, which however are all non-negative. | ||
There is some redundancy in the statement of these conditions, but that does no harm. | There is some redundancy in the statement of these conditions, but that does no harm. | ||
| Line 30: | Line 30: | ||
This is the "canonical form" for a temperament that was developed by [[Dave Keenan]] and [[Douglas Blumeyer]], formed from [[defactoring]] the matrix (aka removing [[contorsion]]) prior to putting it into Hermite form. | This is the "canonical form" for a temperament that was developed by [[Dave Keenan]] and [[Douglas Blumeyer]], formed from [[defactoring]] the matrix (aka removing [[contorsion]]) prior to putting it into Hermite form. | ||
We may write a list of vals (mapping) as a | We may write a list of vals (mapping) as a {{nowrap|(''k'', ''d'')}}-shaped matrix (read "k by d", i.e. with <math>k</math> rows and <math>d</math> columns), where the rows of the matrix are the vals (maps), and <math>d</math> is the ''dimensionality'' of the system<ref group="note">Calling the {{w|prime-counting function}}, written π(''x''), on the prime limit will give us this number. For examples, {{nowrap|π(2) {{=}} 1|π(3) {{=}} 2|π(5) {{=}} 3|π(7) {{=}} 4|π(11) {{=}} 5|etc.}}</ref>. To get the '''defactored Hermite form''', we do the following: | ||
# First, defactor it (aka make sure it is [[saturated]]). <ref>Historically, this step was not explicitly recognized as necessary for normal forms. The vast majority of normal forms catalogued on the wiki are not contorted/enfactored in the first place, but specifically defining this canonical form to include this requirement is an important step toward ensuring that, which will prevent redundant temperaments from being catalogued. In various domains, normal forms are often required to be unique, however, canonical forms are required to be unique even more often that normal forms are; according to [[Wikipedia: Canonical form]], 'the distinction between "canonical" and "normal" forms varies from subfield to subfield. In most fields, a canonical form specifies a unique representation for every object, while a normal form simply specifies its form, without the requirement of uniqueness.' This is the rationale behind defining "canonical" as opposed to merely "normal". To be more specific, The HNF does provide a unique representation of ''matrices'', i.e. from a perspective of pure mathematics, and so you will certainly find throughout mathematical literature that HNF is described as providing a unique representation, and this is correct. However, when applied to the RTT domain, i.e. to ''mappings'', the HNF sometimes fails to identify equivalent mappings as such. And the critical flaw with HNF is its failure to defactor matrices - meaning that a "contorted" mapping matrix has a different Hermite normal form than a non-contorted one with the same kernel - and this is because dividing rows is not a permitted elementary row operation when computing the HNF. See: [https://math.stackexchange.com/a/685922]. The canonical form as described here ''does'' defactor matrices, and therefore it delivers a truly canonical result. <br> | # First, defactor it (aka make sure it is [[saturated]]).<ref group="note">Historically, this step was not explicitly recognized as necessary for normal forms. The vast majority of normal forms catalogued on the wiki are not contorted/enfactored in the first place, but specifically defining this canonical form to include this requirement is an important step toward ensuring that, which will prevent redundant temperaments from being catalogued. In various domains, normal forms are often required to be unique, however, canonical forms are required to be unique even more often that normal forms are; according to [[Wikipedia: Canonical form]], 'the distinction between "canonical" and "normal" forms varies from subfield to subfield. In most fields, a canonical form specifies a unique representation for every object, while a normal form simply specifies its form, without the requirement of uniqueness.' This is the rationale behind defining "canonical" as opposed to merely "normal". To be more specific, The HNF does provide a unique representation of ''matrices'', i.e. from a perspective of pure mathematics, and so you will certainly find throughout mathematical literature that HNF is described as providing a unique representation, and this is correct. However, when applied to the RTT domain, i.e. to ''mappings'', the HNF sometimes fails to identify equivalent mappings as such. And the critical flaw with HNF is its failure to defactor matrices - meaning that a "contorted" mapping matrix has a different Hermite normal form than a non-contorted one with the same kernel - and this is because dividing rows is not a permitted elementary row operation when computing the HNF. See: [https://math.stackexchange.com/a/685922]. The canonical form as described here ''does'' defactor matrices, and therefore it delivers a truly canonical result.<br /> | ||
There is also a rarely mentioned Hermite Canonical Form, or HCF, described here: [http://home.iitk.ac.in/~rksr/html/03CANONICALFACTORIZATIONS.htm], which sort of combines the HNF's constraint and the [[Matrix echelon forms #RREF|RREF]]'s reduced constraint (all pivots equal 1, all other entries in pivot columns are 0, both above and below the pivot), but we didn't find it useful because due to its constraint that all pivots be 1, it does not preserve periods that are genuinely unit fractions of an octave (at first glance, when a pivot is not equal to 1, it might trigger you to think that the mapping is enfactored. But temperaments can legitimately have generators that divide primes evenly, such as 5-limit Blackwood, {{rket| {{map| 5 8 0 }} {{map| 0 0 1 }} }}, which divides the octave into 5 parts. So any form that enforces pivots all be 1's, such as HCF and RREF, would fail this criteria.) It also doesn't qualify as an echelon form, which becomes apparent only when you use it on [[rank-deficient]] matrices, because it doesn't require the rows of all zeros to be at the bottom; instead it (bizarrely, though maybe it's related to how the SNF requires all pivots exactly along the main diagonal) requires the rows to be sorted so that all the pivots fall on the main diagonal.</ref>. Note that if the matrix was not [[full-rank]], this will result in the elimination of some rows<ref>Note that canonicalizing a mapping does not remove trailing ''dimensions'' with only zeros. <br> | There is also a rarely mentioned Hermite Canonical Form, or HCF, described here: [http://home.iitk.ac.in/~rksr/html/03CANONICALFACTORIZATIONS.htm], which sort of combines the HNF's constraint and the [[Matrix echelon forms #RREF|RREF]]'s reduced constraint (all pivots equal 1, all other entries in pivot columns are 0, both above and below the pivot), but we didn't find it useful because due to its constraint that all pivots be 1, it does not preserve periods that are genuinely unit fractions of an octave (at first glance, when a pivot is not equal to 1, it might trigger you to think that the mapping is enfactored. But temperaments can legitimately have generators that divide primes evenly, such as 5-limit Blackwood, {{rket| {{map| 5 8 0 }} {{map| 0 0 1 }} }}, which divides the octave into 5 parts. So any form that enforces pivots all be 1's, such as HCF and RREF, would fail this criteria.) It also doesn't qualify as an echelon form, which becomes apparent only when you use it on [[rank-deficient]] matrices, because it doesn't require the rows of all zeros to be at the bottom; instead it (bizarrely, though maybe it's related to how the SNF requires all pivots exactly along the main diagonal) requires the rows to be sorted so that all the pivots fall on the main diagonal.</ref>. Note that if the matrix was not [[full-rank]], this will result in the elimination of some rows<ref group="note">Note that canonicalizing a mapping does not remove trailing ''dimensions'' with only zeros.<br /> | ||
In the case of a mapping, this would take the form of an extra column of all zeros to the right of any non-zero entries, or in other words, an unmapped prime higher than other mapped prime. For example you could have {{rket| {{map| 1 0 -4 0 }} {{map| 0 1 4 0 }} }} which is just 5-limit meantone but represented in the 7-limit even though prime 7 is not used. <br> | In the case of a mapping, this would take the form of an extra column of all zeros to the right of any non-zero entries, or in other words, an unmapped prime higher than other mapped prime. For example you could have {{rket| {{map| 1 0 -4 0 }} {{map| 0 1 4 0 }} }} which is just 5-limit meantone but represented in the 7-limit even though prime 7 is not used.<br /> | ||
And for a comma basis the form this would take is rotated 90 degrees: a row of all zeros below all other nonzero entries, e.g. [{{vector| 4 -4 1 0 }}].<br> | And for a comma basis the form this would take is rotated 90 degrees: a row of all zeros below all other nonzero entries, e.g. [{{vector| 4 -4 1 0 }}].<br /> | ||
The reason these additional zeros should be preserved and these temperaments be treated as different from their untrimmed counterparts is made clear when we consider the difference in the duals. For a comma basis, the extra dimension implies the presence of extra generators that are unbound to the other generators. For example, a basis for the nullspace of [{{vector| 4 -4 1 }}], or in other words its mapping, as we know well is {{rket| {{map| 1 0 -4 }} {{map| 0 1 4 }} }}. But that is not a basis for the nullspace of [{{vector| 4 -4 1 < | The reason these additional zeros should be preserved and these temperaments be treated as different from their untrimmed counterparts is made clear when we consider the difference in the duals. For a comma basis, the extra dimension implies the presence of extra generators that are unbound to the other generators. For example, a basis for the nullspace of [{{vector| 4 -4 1 }}], or in other words its mapping, as we know well is {{rket| {{map| 1 0 -4 }} {{map| 0 1 4 }} }}. But that is not a basis for the nullspace of [{{vector| 4 -4 1 <span style{{=}}"color: red;">'''0'''</span> }}]; the mapping for that comma basis would have to be {{ket| {{map| 1 0 -4 <span style{{=}}"color: red;">'''0'''</span> }} {{map| 0 1 4 <span style{{=}}"color: red;">'''0'''</span> }} {{map| <span style{{=}}"color: red;">'''0 0 0 1'''</span> }} }}.</ref>. We now have an {{nowrap|(''r'', ''d'')}}-shaped matrix, with ''r'' rows where ''r'' is the ''rank''. | ||
# Then, put this result into HNF. | # Then, put this result into HNF. | ||
| Line 54: | Line 54: | ||
If the ''i''-th entry in the result is negative, change the signs of every entry in the corresponding row of the mapping. | If the ''i''-th entry in the result is negative, change the signs of every entry in the corresponding row of the mapping. | ||
'''Note''' | '''Note:''' The "mapping" (though not the "[[mapping to lattice]]") listed on temperament pages of this wiki are in this form. | ||
The generators in defactored Hermite form of septimal meantone is positive already, so its positive generator form is the same as its defactored Hermite form, [{{val| 1 0 -4 -13 }}, {{val| 0 1 4 10 }}], corresponding to generators of ~2/1 and ~3/1. An example of positive generator form that is different from the defactored Hermite form is the porcupine temperament, elaborated below. | The generators in defactored Hermite form of septimal meantone is positive already, so its positive generator form is the same as its defactored Hermite form, [{{val| 1 0 -4 -13 }}, {{val| 0 1 4 10 }}], corresponding to generators of ~2/1 and ~3/1. An example of positive generator form that is different from the defactored Hermite form is the porcupine temperament, elaborated below. | ||
| Line 169: | Line 169: | ||
=== Minimal generator form === | === Minimal generator form === | ||
The '''minimal generator form''' (or '''mingen form''') is a form specific to rank-2 temperaments, where the generator is positive and no greater than half the period.<ref>This is somewhat like octave reduction combined with octave inversion, because you can't just add or subtract half octaves until it's between 0 and 600 cents; you have to add or subtract octaves until it's between | The '''minimal generator form''' (or '''mingen form''') is a form specific to rank-2 temperaments, where the generator is positive and no greater than half the period.<ref group="note">This is somewhat like octave reduction combined with octave inversion, because you can't just add or subtract half octaves until it's between 0 and 600 cents; you have to add or subtract octaves until it's between −600 and +600 cents, then multiply by −1 if it's negative.</ref><ref group="note">You could always find a smaller and smaller generator by going negative, so this assumes positive generators.</ref> | ||
[[Graham Breed]]'s [http://x31eq.com/temper/ temperament finder] uses this form for all rank-2 temperaments. Septimal meantone in minimal generator form is [{{val| 1 2 4 7 }}, {{val| 0 -1 -4 -10 }}], corresponding to generators of ~2/1 and ~4/3. | [[Graham Breed]]'s [http://x31eq.com/temper/ temperament finder] uses this form for all rank-2 temperaments. Septimal meantone in minimal generator form is [{{val| 1 2 4 7 }}, {{val| 0 -1 -4 -10 }}], corresponding to generators of ~2/1 and ~4/3. | ||
| Line 177: | Line 177: | ||
Consider the example in the diagram given here: [[Generator form manipulation #Beyond rank-2]]. We begin with {{rket| {{map| 1 2 0 -1 }} {{map| 0 -1 6 10 }} {{map| 0 0 -1 -2 }} }} with generators of 1200.6¢, 499.841¢, and 214.024¢, which therefore already satisfies the condition that each generator is less than half the previous generator. But we can transform it into {{rket| {{map| 1 2 2 3 }} {{map| 0 -1 1 0}} {{map| 0 0 -1 -2 }} }} which has a third generator of 116.013¢ instead. This is accomplished by adding row 3 to row 2 five times, which decreases generator 3 by the size of five times row 2, from 214.024¢ by 5 × 499.841 = 2499.205¢ to -2285.18¢; and then subtracting row 3 from row 1 twice, which increases generator 3 by the size of two times row 1, from -2285.18¢ by 2 × 1200.6¢ = 2401.2¢ to 116.013¢. And we can get that generator even smaller if we had instead moved up by 499.841 twice to 1213.71¢ and then down by 1200.6¢ once to 13.109¢ (that's a final mapping of {{rket| {{map| 1 2 -1 -3 }} {{map| 0 -1 8 14 }} {{map| 0 0 -1 -2 }} }}. | Consider the example in the diagram given here: [[Generator form manipulation #Beyond rank-2]]. We begin with {{rket| {{map| 1 2 0 -1 }} {{map| 0 -1 6 10 }} {{map| 0 0 -1 -2 }} }} with generators of 1200.6¢, 499.841¢, and 214.024¢, which therefore already satisfies the condition that each generator is less than half the previous generator. But we can transform it into {{rket| {{map| 1 2 2 3 }} {{map| 0 -1 1 0}} {{map| 0 0 -1 -2 }} }} which has a third generator of 116.013¢ instead. This is accomplished by adding row 3 to row 2 five times, which decreases generator 3 by the size of five times row 2, from 214.024¢ by 5 × 499.841 = 2499.205¢ to -2285.18¢; and then subtracting row 3 from row 1 twice, which increases generator 3 by the size of two times row 1, from -2285.18¢ by 2 × 1200.6¢ = 2401.2¢ to 116.013¢. And we can get that generator even smaller if we had instead moved up by 499.841 twice to 1213.71¢ and then down by 1200.6¢ once to 13.109¢ (that's a final mapping of {{rket| {{map| 1 2 -1 -3 }} {{map| 0 -1 8 14 }} {{map| 0 0 -1 -2 }} }}. | ||
You could find smaller and smaller generators if you wanted, by essentially finding increasingly small "commas" between the other generators' sizes (e.g. 5 | You could find smaller and smaller generators if you wanted, by essentially finding increasingly small "commas" between the other generators' sizes (e.g. {{nowrap|5 × 1200.6¢}} versus {{nowrap|12 × 499.841¢}} is a difference of only 4.908¢) and then shifting generators by those commas. | ||
This problem also precludes the possibility of a definitive maximum generator which is still less than half of the previous generator. | This problem also precludes the possibility of a definitive maximum generator which is still less than half of the previous generator. | ||
| Line 217: | Line 217: | ||
\left[ \begin{array} {rrr} | \left[ \begin{array} {rrr} | ||
\style{background-color:#46C5DD;padding:5px}{-4} & \style{background-color:#FFF200;padding:5px}{1} \\ | \style{background-color: #46C5DD; padding: 5px;}{-4} & \style{background-color: #FFF200; padding: 5px;}{1} \\ | ||
\style{background-color:#FFF200;padding:5px}{4} & \style{background-color:#F2B2B4;padding:5px}{2} \\ | \style{background-color: #FFF200; padding: 5px;}{4} & \style{background-color: #F2B2B4; padding: 5px;}{2} \\ | ||
\style{background-color:#C6DC67;padding:5px}{-1} & \style{background-color:#F2B2B4;padding:5px}{-3} \\ | \style{background-color: #C6DC67; padding: 5px;}{-1} & \style{background-color: #F2B2B4; padding: 5px;}{-3} \\ | ||
\style{background-color:#C6DC67;padding:5px}{0} & \style{background-color:#F2B2B4;padding:5px}{1} \\ | \style{background-color: #C6DC67; padding: 5px;}{0} & \style{background-color: #F2B2B4; padding: 5px;}{1} \\ | ||
\end{array} \right] | \end{array} \right] | ||
| Line 226: | Line 226: | ||
\left[ \begin{array} {rrr} | \left[ \begin{array} {rrr} | ||
\style{background-color:#F2B2B4;padding:5px}{1} & \style{background-color:#F2B2B4;padding:5px}{-3} & \style{background-color:#F2B2B4;padding:5px}{2} & \style{background-color:#FFF200;padding:5px}{1} \\ | \style{background-color: #F2B2B4; padding: 5px;}{1} & \style{background-color: #F2B2B4 ;padding: 5px;}{-3} & \style{background-color: #F2B2B4; padding: 5px;}{2} & \style{background-color: #FFF200; padding: 5px;}{1} \\ | ||
\style{background-color:#C6DC67;padding:5px}{0} & \style{background-color:#C6DC67;padding:5px}{-1} & \style{background-color:#FFF200;padding:5px}{4} & \style{background-color:#46C5DD;padding:5px}{-4} \\ | \style{background-color: #C6DC67; padding: 5px;}{0} & \style{background-color: #C6DC67; padding: 5px;}{-1} & \style{background-color: #FFF200; padding: 5px;}{4} & \style{background-color: #46C5DD; padding: 5px;}{-4} \\ | ||
\end{array} \right] | \end{array} \right] | ||
| Line 233: | Line 233: | ||
</math> | </math> | ||
This has the effect of both reversing the entries within each interval, as well as reversing the order of the intervals themselves. The purpose of these reversals is so that when the HNF tries to put all the zeros in the bottom-left corner, it gravitates them toward where we want them: the higher primes, and commas that will be earlier in the list after the second antitranspose<ref>Because these are going to be put into HNF soon, the reversing of the order of the intervals themselves at the beginning is irrelevant. But it is important that the order of the intervals themselves reverses on the way out, in the second antitranspose. And so for simplicity of explanation's sake, we simply say to do an antitranspose at both the beginning and end of the operation.</ref>. | This has the effect of both reversing the entries within each interval, as well as reversing the order of the intervals themselves. The purpose of these reversals is so that when the HNF tries to put all the zeros in the bottom-left corner, it gravitates them toward where we want them: the higher primes, and commas that will be earlier in the list after the second antitranspose<ref group="note">Because these are going to be put into HNF soon, the reversing of the order of the intervals themselves at the beginning is irrelevant. But it is important that the order of the intervals themselves reverses on the way out, in the second antitranspose. And so for simplicity of explanation's sake, we simply say to do an antitranspose at both the beginning and end of the operation.</ref>. | ||
Now we can defactor and HNF this as if it were a mapping. | Now we can defactor and HNF this as if it were a mapping. | ||
| Line 250: | Line 250: | ||
\left[ \begin{array} {rrr} | \left[ \begin{array} {rrr} | ||
\style{background-color:#F2B2B4;padding:5px}{1} & \style{background-color:#F2B2B4;padding:5px}{0} & \style{background-color:#F2B2B4;padding:5px}{-10} & \style{background-color:#FFF200;padding:5px}{-13} \\ | \style{background-color: #F2B2B4; padding: 5px;}{1} & \style{background-color: #F2B2B4; padding: 5px;}{0} & \style{background-color: #F2B2B4; padding: 5px;}{-10} & \style{background-color: #FFF200; padding: 5px;}{-13} \\ | ||
\style{background-color:#C6DC67;padding:5px}{0} & \style{background-color:#C6DC67;padding:5px}{1} & \style{background-color:#FFF200;padding:5px}{-4} & \style{background-color:#46C5DD;padding:5px}{4} \\ | \style{background-color: #C6DC67; padding: 5px;}{0} & \style{background-color: #C6DC67; padding: 5px;}{1} & \style{background-color: #FFF200; padding: 5px;}{-4} & \style{background-color: #46C5DD; padding: 5px;}{4} \\ | ||
\end{array} \right] | \end{array} \right] | ||
| Line 257: | Line 257: | ||
\left[ \begin{array} {rrr} | \left[ \begin{array} {rrr} | ||
\style{background-color:#46C5DD;padding:5px}{4} & \style{background-color:#FFF200;padding:5px}{13} \\ | \style{background-color: #46C5DD; padding: 5px;}{4} & \style{background-color: #FFF200; padding: 5px;}{13} \\ | ||
\style{background-color:#FFF200;padding:5px}{-4} & \style{background-color:#F2B2B4;padding:5px}{-10} \\ | \style{background-color: #FFF200; padding: 5px;}{-4} & \style{background-color: #F2B2B4; padding: 5px;}{-10} \\ | ||
\style{background-color:#C6DC67;padding:5px}{1} & \style{background-color:#F2B2B4;padding:5px}{0} \\ | \style{background-color: #C6DC67; padding: 5px;}{1} & \style{background-color: #F2B2B4; padding: 5px;}{0} \\ | ||
\style{background-color:#C6DC67;padding:5px}{0} & \style{background-color:#F2B2B4;padding:5px}{1} \\ | \style{background-color: #C6DC67; padding: 5px;}{0} & \style{background-color: #F2B2B4; padding: 5px;}{1} \\ | ||
\end{array} \right] | \end{array} \right] | ||
| Line 294: | Line 294: | ||
== Maple code == | == Maple code == | ||
Below is [[Wikipedia: Maple (software)|Maple]] code for finding the normal interval and val list, given an interval list or a val list. Note that this code does not deal with torsion/enfactoring, so it assumes your lists have already been defactored. | Below is [[Wikipedia:Maple (software)|Maple]] code for finding the normal interval and val list, given an interval list or a val list. Note that this code does not deal with torsion/enfactoring, so it assumes your lists have already been defactored. | ||
{{Databox| Code | | {{Databox| Code | | ||
| Line 434: | Line 434: | ||
}} | }} | ||
== | == Footnotes == | ||
<references/> | <references group="note" /> | ||
[[Category:Regular temperament theory]] | [[Category:Regular temperament theory]] | ||
[[Category:Math]] | [[Category:Math]] | ||
[[Category:Mapping]] | [[Category:Mapping]] | ||