Dual list: Difference between revisions

Cmloegcmluin (talk | contribs)
hyphenate
Sintel (talk | contribs)
-legacy, todo intro, inaccessible
 
(13 intermediate revisions by 6 users not shown)
Line 1: Line 1:
=Definition=
{{inacc}}
{{todo|intro|inline=1}}
: ''This page gives a more mathematical take on this topic. For a basic introduction, see [[comma basis]].''


If A is an integral matrix, denote by Saturate(A) the integral matrix which is the [[Saturation|saturation]] (or [[defactoring|defactored]] form) of A, defined in terms of the right reducing matrix to Smith normal form. We may clean the result up a little by LLL reduction, so let Sat(A) = LLL(Saturate(A)). The square matrix with rational coefficients A`A, where A` is the pseudoinverse of A, is an nxn projection matrix, where n is the number of columns of A. Let us also define Clear(P) to be the rational number matrix P cleared of denominators by multiplying through the rows by the LCM of the denominators, and Hrm(A) to be the Hermite reduction of A, with any rows consisting of zeros removed. We may combine these into the dual list function: Dulist(A) = Sat(Hrm(Clear(I - A`A))), where I is the nxn identity matrix.
== Definition ==
If '''A''' is an integral matrix, denote by Saturate('''A''') the integral matrix which is the [[Mathematical theory of saturation|saturation]] of '''A''', defined in terms of the right reducing matrix to Smith normal form. We may clean the result up a little by [[LLL reduction]], so let {{nowrap|Sat('''A''') {{=}} LLL(Saturate('''A'''))}}. The square matrix with rational coefficients '''A'''{{+}}'''A''', where {{+}} denotes the {{w|Moore–Penrose pseudoinverse}}, is an ''n''×''n'' projection matrix, where ''n'' is the number of columns of '''A'''. Let us also define clr('''P''') to be the rational number matrix '''P''' cleared of denominators by multiplying through the rows by the LCM of the denominators, and hrm('''A''') to be the Hermite reduction of '''A''', with any rows consisting of zeros removed. We may combine these into the dual list function: {{nowrap|dl('''A''') {{=}} Sat(hrm(clr('''I''' − '''A'''{{+}}'''A''')))}}, where '''I''' is the ''n''×''n'' identity matrix.


The interest of the dual list stems from the fact that if A is a list of vals defining a temperament, then Dulist(A) is a list of monzos defining the same temperament, and conversely--Dulist applied to a list of monzos defining a temperament gives a list of vals defining the same temperament.
The interest of the dual list stems from the fact that if '''A''' is a list of vals defining a temperament, then dl('''A''') is a list of monzos defining the same temperament, and conversely, Dulist applied to a list of monzos defining a temperament gives a list of vals defining the same temperament.


=Equivalence to null-space=
== Examples ==
dl[{{map| 31 49 72 87 107 }}, {{map| 41 65 95 115 142 }}, {{map| 72 114 167 202 249 }}]) {{nowrap|{{=}} [{{vector| -3 2 -1 2 -1 }}, {{vector| -2 -3 -1 2 1 }}, {{vector| -2 0 3 -3 1 }}]}}


If one is previously familiar with linear algebra concepts, the list of vals defining a temperament can be thought of as a mapping, and its dual list (the list of monzos, or comma-basis) can be thought of as a basis for its null-space.  
In this first example, the mapping contains a redundant row; the third row is a linear combination of the other two ({{nowrap|31 + 41 {{=}} 72|49 + 65 {{=}} 114}}, etc). Therefore, the dual list operation returns a comma basis with nullity 3, because the rank is truly 2 (and the rank and nullity must sum to the dimensionality, which is 5 here, because there are 5 terms in each map and comma, i.e. it is 11-limit).


Null-space operations are readily available in many math libraries.
dl[{{vector| -3 2 -1 2 -1 }}, {{vector| -2 -3 -1 2 1 }}, {{vector| -2 0 3 -3 1 }}]) {{nowrap|{{=}} [{{map| 1 1 3 3 2 }}, {{map| 0 6 -7 -2 15 }}]}}


To reverse the null-space operation, that is, to find a mapping from a basis for the null-space, you can also use the null-space operation; the relationship between the two matrices works both ways. However, most math libraries' null-space operation is designed to work for mappings, and so if you want correct results, you must transform the basis for the null-space into a mapping-like form, perform the null-space operation, and then undo the initial transformation. This initial transformation you must do and undo is called the anti-transpose, which is just like the typical transpose of a matrix, except instead of reflecting the matrix's values across the main diagonal (starting from either the top-left or bottom-right corner), you reflect them across the anti-diagonal (starting from either the top-right or bottom-left corner).
dl[{{map| 1 1 3 3 2 }}, {{map| 0 6 -7 -2 15 }}]) {{nowrap|{{=}} [{{vector| -3 2 -1 2 -1 }}, {{vector| -2 -3 -1 2 1 }}, {{vector| -2 0 3 -3 1 }}]}}


You can remember this because most mappings and comma bases have zeroes in the bottom-left corner, and you want to keep them there; some kind of transpose is necessary to convert the constituent comma vectors columns of the comma basis into rows as if they were constituent generator mapping rows of a mapping, but a normal transpose of the comma basis would flip its zeroes into the top-right corner instead.
[[Category:Regular temperament theory]]
 
[[Category:Math]]
=Examples=
 
Dulist([{{map|31 49 72 87 107}}, {{map|41 65 95 115 142}}, {{map|72 114 167 202 249}}]) = [{{vector|-3 2 -1 2 -1}}, {{vector|-2 -3 -1 2 1}}, {{vector|-2 0 3 -3 1}}]
 
In this first example, the mapping contains a redundant row; the third row is a linear combination of the other two (31+41=72, 49+65=114, etc.). Therefore, the dual list operation returns a comma basis with nullity 3, because the rank is truly 2 (and the rank and nullity must sum to the dimensionality, which is 5 here, because there are 5 terms in each map and comma, i.e. it is 11-limit).
 
Dulist([{{vector|-3 2 -1 2 -1}}, {{vector|-2 -3 -1 2 1}}, {{vector|-2 0 3 -3 1}}]) = [{{map|1 1 3 3 2}}, {{map|0 6 -7 -2 15}}]
 
Dulist([{{map|1 1 3 3 2}}, {{map|0 6 -7 -2 15}}]) = [{{vector|-3 2 -1 2 -1}}, {{vector|-2 -3 -1 2 1}}, {{vector|-2 0 3 -3 1}}]