back to list

Hermite normal form

🔗genewardsmith <genewardsmith@juno.com>

3/24/2002 3:41:30 AM

The normal form I mentioned, which "fixed" my first try, turns out on reflection to be simply Hermite normal form. Hence, no special wedge products are required--one could, for instance, start with columns which are et maps. I propose therefore that we standardize the mapping to be the (column) Hermite normal form, and the generators to be the generators (in order) that this gives us.

🔗dkeenanuqnetau <d.keenan@uq.net.au>

3/24/2002 4:27:12 PM

--- In tuning-math@y..., "genewardsmith" <genewardsmith@j...> wrote:
> The normal form I mentioned, which "fixed" my first try, turns out
on reflection to be simply Hermite normal form. Hence, no special
wedge products are required--one could, for instance, start with
columns which are et maps. I propose therefore that we standardize the
mapping to be the (column) Hermite normal form, and the generators to
be the generators (in order) that this gives us.
>

I'm not familiar with this, and Mathworld was no help to me (again).
http://mathworld.wolfram.com/HermiteNormalForm.html
It doesn't give me any clue as to what the HNF matrix looks like
(except that it has a determinant of +-1) or how to compute it.

Would you be so kind as to give as examples, the HNF matrices and
consequent generators for Meantone, Diaschismic and Augmented, as
5-limit linear temperaments, Twin meantone and Half meantone fifth
as degenerate 5-limit whatevers, and Starling as the 7-limit planar
temperament where the 125:126 vanishes?

🔗genewardsmith <genewardsmith@juno.com>

3/24/2002 8:22:59 PM

--- In tuning-math@y..., "dkeenanuqnetau" <d.keenan@u...> wrote:

> Would you be so kind as to give as examples, the HNF matrices and
> consequent generators for Meantone, Diaschismic and Augmented, as
> 5-limit linear temperaments, Twin meantone and Half meantone fifth
> as degenerate 5-limit whatevers, and Starling as the 7-limit planar
> temperament where the 125:126 vanishes?

Do you want this if half-fourth doesn't work? Hermite form seems to
allow twin meantone and schismic, and half-fifth meantome and schismic, but not the half-fourth versions.

🔗paulerlich <paul@stretch-music.com>

3/25/2002 1:34:49 PM

--- In tuning-math@y..., "genewardsmith" <genewardsmith@j...> wrote:

> Do you want this if half-fourth doesn't work? Hermite form seems to
> allow twin meantone and schismic, and half-fifth meantome and
>schismic, but not the half-fourth versions.

that seems bizarre. is there an intuitive explanation of why this
should be the case?

🔗dkeenanuqnetau <d.keenan@uq.net.au>

3/24/2002 9:48:12 PM

--- In tuning-math@y..., "genewardsmith" <genewardsmith@j...> wrote:
> --- In tuning-math@y..., "dkeenanuqnetau" <d.keenan@u...> wrote:
>
> > Would you be so kind as to give as examples, the HNF matrices and
> > consequent generators for Meantone, Diaschismic and Augmented, as
> > 5-limit linear temperaments, Twin meantone and Half meantone fifth
> > as degenerate 5-limit whatevers, and Starling as the 7-limit
planar
> > temperament where the 125:126 vanishes?
>
> Do you want this if half-fourth doesn't work? Hermite form seems to
> allow twin meantone and schismic, and half-fifth meantome and
schismic, but not the half-fourth versions.

That's odd, but I'm still interested in seeing the others.

🔗genewardsmith <genewardsmith@juno.com>

3/29/2002 12:18:40 AM

--- In tuning-math@y..., "paulerlich" <paul@s...> wrote:
> --- In tuning-math@y..., "genewardsmith" <genewardsmith@j...> wrote:

> > Do you want this if half-fourth doesn't work? Hermite form seems to
> > allow twin meantone and schismic, and half-fifth meantome and
> >schismic, but not the half-fourth versions.

> that seems bizarre. is there an intuitive explanation of why this
> should be the case?

It leads off with positive elements in each column.

🔗Carl Lumma <carl@lumma.org>

1/10/2012 1:14:13 PM

I'd like to implement the Hermite normal form in Scheme.
Googling didn't produce code for it in any language, and
most definitions apply only to square matrices. Gene's
Maple on the wiki only calls a built-in function.

I'm not going to be putting the movie-watching habits of
30 million Americans into a matrix, so I don't care if
the method is the most efficient. But it does have to
work with rectangular matrices.

Any links or ideas?

-Carl

🔗gbreed@gmail.com

1/10/2012 1:37:52 PM

I've got code in Python, as ever.
If you have code for square matrices that's fine. Assuming it's a row space you do all operations consistently for full rows. When a column ends up with zeros in the significant positions, skip it.

Graham

------Original message------
From: Carl Lumma <carl@lumma.org>
To: <tuning-math@yahoogroups.com>
Date: Tuesday, January 10, 2012 1:14:13 PM GMT-0800
Subject: [tuning-math] Hermite normal form

I'd like to implement the Hermite normal form in Scheme.
Googling didn't produce code for it in any language, and
most definitions apply only to square matrices. Gene's
Maple on the wiki only calls a built-in function.

I'm not going to be putting the movie-watching habits of
30 million Americans into a matrix, so I don't care if
the method is the most efficient. But it does have to
work with rectangular matrices.

Any links or ideas?

-Carl

------------------------------------

Yahoo! Groups Links

🔗Carl Lumma <carl@lumma.org>

1/10/2012 1:46:18 PM

At 01:37 PM 1/10/2012, you wrote:
>Content-Transfer-Encoding: 7bit
>
>I've got code in Python, as ever.

Can you point me to the relevant function? I assumed you
were using a pari built-in.

>If you have code for square matrices that's fine. Assuming it's a row
>space you do all operations consistently for full rows. When a column
>ends up with zeros in the significant positions, skip it.

Sorry, lost me here, can you give an example? Or I guess I
could just trust the function you point me to.

-Carl

🔗gbreed@gmail.com

1/10/2012 1:53:37 PM

regutils.lattice_reduction
This screen's too small for examples

Graham

------Original message------
From: Carl Lumma <carl@lumma.org>
To: <tuning-math@yahoogroups.com>
Date: Tuesday, January 10, 2012 1:46:18 PM GMT-0800
Subject: Re: [tuning-math] Hermite normal form

At 01:37 PM 1/10/2012, you wrote:
>Content-Transfer-Encoding: 7bit
>
>I've got code in Python, as ever.

Can you point me to the relevant function? I assumed you
were using a pari built-in.

>If you have code for square matrices that's fine. Assuming it's a row
>space you do all operations consistently for full rows. When a column
>ends up with zeros in the significant positions, skip it.

Sorry, lost me here, can you give an example? Or I guess I
could just trust the function you point me to.

-Carl

------------------------------------

Yahoo! Groups Links

🔗Mike Battaglia <battaglia01@gmail.com>

1/10/2012 1:53:37 PM

On Tue, Jan 10, 2012 at 4:46 PM, Carl Lumma <carl@lumma.org> wrote:
>
> >If you have code for square matrices that's fine. Assuming it's a row
> >space you do all operations consistently for full rows. When a column
> >ends up with zeros in the significant positions, skip it.
>
> Sorry, lost me here, can you give an example? Or I guess I
> could just trust the function you point me to.
>
> -Carl

I think Graham meant "column" instead of "row" above...?

I think he's saying that a temperament is defined as the row space of
a mapping matrix: the space of all vectors that you get by adding
linear combinations of the rows. So if your matrix is |<7 11 16| <12
19 28|>, then 19p and 31p are going to be in the row space of that
matrix, because you can get to them by adding combinations of rows
together. And <1 1 0| and <0 1 4| will also be in the row space too.
So will <0.5 0.5 0|.

For rank 2, this is exactly the same thing as a plane that goes
through the origin, which is what Grassmannians are supposed to
represent. So if you just add a bunch of zero vals at the bottom of
the matrix to make it square, you end up getting the same row space
and hence the same temperament.

tl;dr, throw some zero vals on the bottom and make it square and then
take them off at the end.

-Mike

🔗Mike Battaglia <battaglia01@gmail.com>

1/10/2012 1:58:33 PM

On Tue, Jan 10, 2012 at 4:46 PM, Carl Lumma <carl@lumma.org> wrote:
>
> >If you have code for square matrices that's fine. Assuming it's a row
> >space you do all operations consistently for full rows. When a column
> >ends up with zeros in the significant positions, skip it.
>
> Sorry, lost me here, can you give an example? Or I guess I
> could just trust the function you point me to.
>
> -Carl

Also, despite that this causes problems with contorsion, I really
don't like think of it as row spaces, but as row lattices. Or, more
intuitively, periodicity blocks in val space. <7 11 16| and <12 19 28|
are like "unison vectors" in this dual space or something, and all of
the stuff you know about Fokker blocks applies. If <7 11 16| and <12
19 28| are "unison vectors," then <1 1 0| and <0 1 4| are also "unison
vectors" in the same lattice. <0 0 0| is hence also a unison vector.
So if you have a Hermite reduction subroutine that requires you to
have a square matrix, just throw <0 0 0|, which will have the same
effect as adding 1/1 to a list of unison vectors.

That's part of the reason why I was talking about formalizing this &
operation a while ago, or the # operation or whatever, and doing it in
a way so that you can talk about 81/80 & 25/24 just like you can talk
about 7p & 12p. It's the same basic operation for both, and it would
be nice to axiomatize it so people like Ryan Avella can work out some
basic stuff using some basic algebraic rules on the back of a cocktail
napkin, should inspiration so strike.

-Mike

🔗gbreed@gmail.com

1/10/2012 2:25:02 PM

Oh, sure, you could do that. But it isn't what I meant.

Graham

------Original message------
From: Mike Battaglia <battaglia01@gmail.com>
To: <tuning-math@yahoogroups.com>
Date: Tuesday, January 10, 2012 4:53:37 PM GMT-0500
Subject: Re: [tuning-math] Hermite normal form

On Tue, Jan 10, 2012 at 4:46 PM, Carl Lumma <carl@lumma.org> wrote:
>
> >If you have code for square matrices that's fine. Assuming it's a row
> >space you do all operations consistently for full rows. When a column
> >ends up with zeros in the significant positions, skip it.
>
> Sorry, lost me here, can you give an example? Or I guess I
> could just trust the function you point me to.
>
> -Carl

I think Graham meant "column" instead of "row" above...?

I think he's saying that a temperament is defined as the row space of
a mapping matrix: the space of all vectors that you get by adding
linear combinations of the rows. So if your matrix is |<7 11 16| <12
19 28|>, then 19p and 31p are going to be in the row space of that
matrix, because you can get to them by adding combinations of rows
together. And <1 1 0| and <0 1 4| will also be in the row space too.
So will <0.5 0.5 0|.

For rank 2, this is exactly the same thing as a plane that goes
through the origin, which is what Grassmannians are supposed to
represent. So if you just add a bunch of zero vals at the bottom of
the matrix to make it square, you end up getting the same row space
and hence the same temperament.

tl;dr, throw some zero vals on the bottom and make it square and then
take them off at the end.

-Mike

------------------------------------

Yahoo! Groups Links

🔗Carl Lumma <carl@lumma.org>

1/10/2012 2:39:31 PM

I don't find the string "hermite" in regutils.py.
I see a lattice_reduction function, but it says it's
for reduced echelon form. Am I looking in the wrong
place? I'm hoping for something applicable to normal
interval lists.

-Carl

At 01:53 PM 1/10/2012, you wrote:
>Content-Transfer-Encoding: 7bit
>
>regutils.lattice_reduction
>This screen's too small for examples
>
>
> Graham
>
>------Original message------
>From: Carl Lumma <carl@lumma.org>
>To: <tuning-math@yahoogroups.com>
>Date: Tuesday, January 10, 2012 1:46:18 PM GMT-0800
>Subject: Re: [tuning-math] Hermite normal form
>
>At 01:37 PM 1/10/2012, you wrote:
>>Content-Transfer-Encoding: 7bit
>>
>>I've got code in Python, as ever.
>
>Can you point me to the relevant function? I assumed you
>were using a pari built-in.
>
>>If you have code for square matrices that's fine. Assuming it's a row
>>space you do all operations consistently for full rows. When a column
>>ends up with zeros in the significant positions, skip it.
>
>Sorry, lost me here, can you give an example? Or I guess I
>could just trust the function you point me to.
>
>-Carl
>
>
>
>------------------------------------
>
>Yahoo! Groups Links
>

🔗gbreed@gmail.com

1/10/2012 2:56:33 PM

That's the one. I didn't understand the definitions of Hermite normal form but it turns out I implemented it anyway.

Graham

------Original message------
From: Carl Lumma <carl@lumma.org>
To: <tuning-math@yahoogroups.com>
Date: Tuesday, January 10, 2012 2:39:31 PM GMT-0800
Subject: Re: Re: [tuning-math] Hermite normal form

I don't find the string "hermite" in regutils.py.
I see a lattice_reduction function, but it says it's
for reduced echelon form. Am I looking in the wrong
place? I'm hoping for something applicable to normal
interval lists.

-Carl

At 01:53 PM 1/10/2012, you wrote:
>Content-Transfer-Encoding: 7bit
>
>regutils.lattice_reduction
>This screen's too small for examples
>
>
> Graham
>
>------Original message------
>From: Carl Lumma <carl@lumma.org>
>To: <tuning-math@yahoogroups.com>
>Date: Tuesday, January 10, 2012 1:46:18 PM GMT-0800
>Subject: Re: [tuning-math] Hermite normal form
>
>At 01:37 PM 1/10/2012, you wrote:
>>Content-Transfer-Encoding: 7bit
>>
>>I've got code in Python, as ever.
>
>Can you point me to the relevant function? I assumed you
>were using a pari built-in.
>
>>If you have code for square matrices that's fine. Assuming it's a row
>>space you do all operations consistently for full rows. When a column
>>ends up with zeros in the significant positions, skip it.
>
>Sorry, lost me here, can you give an example? Or I guess I
>could just trust the function you point me to.
>
>-Carl
>
>
>
>------------------------------------
>
>Yahoo! Groups Links
>

------------------------------------

Yahoo! Groups Links