From f13ce987113297ba81f28e18854639c100aa5193 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 14:54:21 -0400 Subject: [PATCH 01/15] dft for symmetric group algebra when p|n The DFT for the SGA throws a ZeroDivisionError p|n. Uses the idempotents as computed in [Murphy '83] to build the Pierce decomposition of the group algebra over a finite field. The "modular" Fourier transform is the homomorphic projection onto each block via v |--> v*e_i. This change of basis matrix is the modular Fourier transform, and works even when p|n. --- src/sage/combinat/symmetric_group_algebra.py | 54 +++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index b0214063e3b..18e4757537b 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1909,12 +1909,14 @@ def dft(self, form="seminormal", mult='l2r'): """ if form == "seminormal": return self._dft_seminormal(mult=mult) + if form == "modular": + return self._dft_modular() else: raise ValueError("invalid form (= %s)" % form) - + def _dft_seminormal(self, mult='l2r'): """ - Return the seminormal form of the discrete Fourier for ``self``. + Return the seminormal form of the discrete Fourier transform for ``self``. INPUT: @@ -1940,6 +1942,54 @@ def _dft_seminormal(self, mult='l2r'): """ snb = self.seminormal_basis(mult=mult) return matrix([vector(b) for b in snb]).inverse().transpose() + + def _dft_modular(self): + """ + Return the discrete Foruier transform when the characterisc divides the order of the group. + The usual .dft() throws ZeroDivisionError when p|n. + + EXAMPLES: + p=3, n=3: + sage: SGA_3_3 = SymmetricGroupAlgebra(GF(3),3) + sage: SGA_3_3.dft(form="modular") + [1 0 0 0 0 0] + [0 0 0 1 0 0] + [0 0 0 0 0 1] + [0 0 1 0 0 0] + [0 1 0 0 0 0] + [0 0 0 0 1 0] + + """ + #helper function to flatten a list + def flatten(l): + return [item for sublist in l for item in sublist] + + #create a spanning set for the block corresponding to an idempotent + def spanning_set(idem,p,n): + return [self(sigma)*idem for sigma in self.group()] + + #compute all the blocks + #compute the submodule corresponding to span_GF(p){\sigma*e_i | \sigma \in S_n} + def symmetric_group_blocks(p,n): + idempotents = self.central_orthogonal_idempotents() + return [self.submodule(spanning_set(idem,p,n)) for idem in idempotents] + + #implements modular Fourier transform + #project v onto each block U_i = F_p[S_n]*e_i + #use \pi_i: v |--> v*e_i as a projection + def modular_fourier_transform(p,n): + blocks = symmetric_group_blocks(p,n) + #compute the list of basis vectors lifed to the SGA from each block + block_decomposition_basis = flatten([[u.lift() for u in block.basis()] for block in blocks]) + #the elements of the symmetric group are ordered, giving the map from the standard basis + sym_group_list = list(self.group()) + change_of_basis_matrix = [] + for b in block_decomposition_basis: + coord_vector = [0]*len(sym_group_list) + for pair in list(b): + coord_vector[sym_group_list.index(pair[0])] = pair[1] + change_of_basis_matrix.append(coord_vector) + return Matrix(self.base_ring(),change_of_basis_matrix) def epsilon_ik(self, itab, ktab, star=0, mult='l2r'): r""" From 488b957913d9b694e13804f62ce425cce1d81ffb Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 15:16:58 -0400 Subject: [PATCH 02/15] Update symmetric_group_algebra.py --- src/sage/combinat/symmetric_group_algebra.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index 18e4757537b..0ce94b72c36 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1913,7 +1913,6 @@ def dft(self, form="seminormal", mult='l2r'): return self._dft_modular() else: raise ValueError("invalid form (= %s)" % form) - def _dft_seminormal(self, mult='l2r'): """ Return the seminormal form of the discrete Fourier transform for ``self``. From ac3a65b47a3801adce5536a650a27de0cf6b6467 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 15:24:23 -0400 Subject: [PATCH 03/15] remove trailing whitespace attempting to get through lint --- src/sage/combinat/symmetric_group_algebra.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index 0ce94b72c36..b13e7632f4b 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1962,20 +1962,15 @@ def _dft_modular(self): #helper function to flatten a list def flatten(l): return [item for sublist in l for item in sublist] - #create a spanning set for the block corresponding to an idempotent def spanning_set(idem,p,n): return [self(sigma)*idem for sigma in self.group()] - #compute all the blocks - #compute the submodule corresponding to span_GF(p){\sigma*e_i | \sigma \in S_n} def symmetric_group_blocks(p,n): idempotents = self.central_orthogonal_idempotents() + #compute the submodule corresponding to span_GF(p){\sigma*e_i | \sigma \in S_n} return [self.submodule(spanning_set(idem,p,n)) for idem in idempotents] - - #implements modular Fourier transform - #project v onto each block U_i = F_p[S_n]*e_i - #use \pi_i: v |--> v*e_i as a projection + #project v onto each block U_i = F_p[S_n]*e_i via \pi_i: v |--> v*e_i def modular_fourier_transform(p,n): blocks = symmetric_group_blocks(p,n) #compute the list of basis vectors lifed to the SGA from each block From c52728eee22d6021e73c69827ff8d2d06fabb4d9 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 15:40:15 -0400 Subject: [PATCH 04/15] finish adapting from Jupyter notebook --- src/sage/combinat/symmetric_group_algebra.py | 36 +++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index b13e7632f4b..b17a4b428bf 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1913,6 +1913,7 @@ def dft(self, form="seminormal", mult='l2r'): return self._dft_modular() else: raise ValueError("invalid form (= %s)" % form) + def _dft_seminormal(self, mult='l2r'): """ Return the seminormal form of the discrete Fourier transform for ``self``. @@ -1947,8 +1948,10 @@ def _dft_modular(self): Return the discrete Foruier transform when the characterisc divides the order of the group. The usual .dft() throws ZeroDivisionError when p|n. - EXAMPLES: + EXAMPLES:: + p=3, n=3: + sage: SGA_3_3 = SymmetricGroupAlgebra(GF(3),3) sage: SGA_3_3.dft(form="modular") [1 0 0 0 0 0] @@ -1963,27 +1966,26 @@ def _dft_modular(self): def flatten(l): return [item for sublist in l for item in sublist] #create a spanning set for the block corresponding to an idempotent - def spanning_set(idem,p,n): + def spanning_set(idem): return [self(sigma)*idem for sigma in self.group()] #compute all the blocks - def symmetric_group_blocks(p,n): + def symmetric_group_blocks(): idempotents = self.central_orthogonal_idempotents() #compute the submodule corresponding to span_GF(p){\sigma*e_i | \sigma \in S_n} - return [self.submodule(spanning_set(idem,p,n)) for idem in idempotents] + return [self.submodule(spanning_set(idem)) for idem in idempotents] #project v onto each block U_i = F_p[S_n]*e_i via \pi_i: v |--> v*e_i - def modular_fourier_transform(p,n): - blocks = symmetric_group_blocks(p,n) - #compute the list of basis vectors lifed to the SGA from each block - block_decomposition_basis = flatten([[u.lift() for u in block.basis()] for block in blocks]) - #the elements of the symmetric group are ordered, giving the map from the standard basis - sym_group_list = list(self.group()) - change_of_basis_matrix = [] - for b in block_decomposition_basis: - coord_vector = [0]*len(sym_group_list) - for pair in list(b): - coord_vector[sym_group_list.index(pair[0])] = pair[1] - change_of_basis_matrix.append(coord_vector) - return Matrix(self.base_ring(),change_of_basis_matrix) + blocks = symmetric_group_blocks(p,n) + #compute the list of basis vectors lifed to the SGA from each block + block_decomposition_basis = flatten([[u.lift() for u in block.basis()] for block in blocks]) + #the elements of the symmetric group are ordered, giving the map from the standard basis + sym_group_list = list(self.group()) + change_of_basis_matrix = [] + for b in block_decomposition_basis: + coord_vector = [0]*len(sym_group_list) + for pair in list(b): + coord_vector[sym_group_list.index(pair[0])] = pair[1] + change_of_basis_matrix.append(coord_vector) + return Matrix(self.base_ring(),change_of_basis_matrix) def epsilon_ik(self, itab, ktab, star=0, mult='l2r'): r""" From e8dfbd0ae6ad2c4f3e532b5ab18d5038cd378b13 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 15:55:43 -0400 Subject: [PATCH 05/15] put all code into single lines remove helper functions in favor of lambda functions --- src/sage/combinat/symmetric_group_algebra.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index b17a4b428bf..6b3a9cc3230 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1962,19 +1962,14 @@ def _dft_modular(self): [0 0 0 0 1 0] """ - #helper function to flatten a list - def flatten(l): - return [item for sublist in l for item in sublist] #create a spanning set for the block corresponding to an idempotent - def spanning_set(idem): - return [self(sigma)*idem for sigma in self.group()] - #compute all the blocks - def symmetric_group_blocks(): - idempotents = self.central_orthogonal_idempotents() - #compute the submodule corresponding to span_GF(p){\sigma*e_i | \sigma \in S_n} - return [self.submodule(spanning_set(idem)) for idem in idempotents] + spanning_set = lambda idem: [self(sigma)*idem for sigma in self.group()] + #compute central primitive orthogonal idempotents + idempotents = self.central_orthogonal_idempotents() #project v onto each block U_i = F_p[S_n]*e_i via \pi_i: v |--> v*e_i - blocks = symmetric_group_blocks(p,n) + blocks = [self.submodule(spanning_set(idem)) for idem in idempotents] + #helper function to flatten a list + flatten = lambda l: [item for sublist in l for item in sublist] #compute the list of basis vectors lifed to the SGA from each block block_decomposition_basis = flatten([[u.lift() for u in block.basis()] for block in blocks]) #the elements of the symmetric group are ordered, giving the map from the standard basis From 6599439e81f816bf88fba74ec28921449b7c670c Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 16:01:53 -0400 Subject: [PATCH 06/15] Update symmetric_group_algebra.py --- src/sage/combinat/symmetric_group_algebra.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index 6b3a9cc3230..d5f6105e650 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1913,7 +1913,7 @@ def dft(self, form="seminormal", mult='l2r'): return self._dft_modular() else: raise ValueError("invalid form (= %s)" % form) - + def _dft_seminormal(self, mult='l2r'): """ Return the seminormal form of the discrete Fourier transform for ``self``. @@ -1942,7 +1942,7 @@ def _dft_seminormal(self, mult='l2r'): """ snb = self.seminormal_basis(mult=mult) return matrix([vector(b) for b in snb]).inverse().transpose() - + def _dft_modular(self): """ Return the discrete Foruier transform when the characterisc divides the order of the group. From 1be5ea9b6be66c898731a450f574e36b3da07336 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 19:17:08 -0400 Subject: [PATCH 07/15] Update symmetric_group_algebra.py --- src/sage/combinat/symmetric_group_algebra.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index d5f6105e650..e8fd9fcd8e2 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1950,10 +1950,8 @@ def _dft_modular(self): EXAMPLES:: - p=3, n=3: - - sage: SGA_3_3 = SymmetricGroupAlgebra(GF(3),3) - sage: SGA_3_3.dft(form="modular") + sage: GF3S3 = SymmetricGroupAlgebra(GF(3),3) + sage: GF3S3._dft_modular() [1 0 0 0 0 0] [0 0 0 1 0 0] [0 0 0 0 0 1] From ef83c0ff94586eeae9ade4ce7aeab322a1ea5317 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 21:02:45 -0400 Subject: [PATCH 08/15] try formatting matrix --- src/sage/combinat/symmetric_group_algebra.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index e8fd9fcd8e2..deb5e767f91 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1952,13 +1952,12 @@ def _dft_modular(self): sage: GF3S3 = SymmetricGroupAlgebra(GF(3),3) sage: GF3S3._dft_modular() - [1 0 0 0 0 0] - [0 0 0 1 0 0] - [0 0 0 0 0 1] - [0 0 1 0 0 0] - [0 1 0 0 0 0] - [0 0 0 0 1 0] - + [1 0 0 0 0 0] + [0 0 0 1 0 0] + [0 0 0 0 0 1] + [0 0 1 0 0 0] + [0 1 0 0 0 0] + [0 0 0 0 1 0] """ #create a spanning set for the block corresponding to an idempotent spanning_set = lambda idem: [self(sigma)*idem for sigma in self.group()] From 9272f20b4e9806acddd1972109b80a40ddf6ba96 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 22:27:20 -0400 Subject: [PATCH 09/15] example was wrong use p=2, n=3 for a small example. --- src/sage/combinat/symmetric_group_algebra.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index deb5e767f91..d2db0de3a21 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1950,14 +1950,14 @@ def _dft_modular(self): EXAMPLES:: - sage: GF3S3 = SymmetricGroupAlgebra(GF(3),3) + sage: GF3S3 = SymmetricGroupAlgebra(GF(2),3) sage: GF3S3._dft_modular() - [1 0 0 0 0 0] - [0 0 0 1 0 0] - [0 0 0 0 0 1] - [0 0 1 0 0 0] - [0 1 0 0 0 0] - [0 0 0 0 1 0] + [1 0 0 0 1 0] + [0 1 0 0 0 1] + [0 0 1 0 0 1] + [0 0 0 1 1 0] + [1 0 0 1 1 0] + [0 1 1 0 0 1] """ #create a spanning set for the block corresponding to an idempotent spanning_set = lambda idem: [self(sigma)*idem for sigma in self.group()] From 132db041cd838a5a484e95f60526fe2a1d32e4bb Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Thu, 4 Apr 2024 23:14:44 -0400 Subject: [PATCH 10/15] matrix is misspelled lowercase m in matrix --- src/sage/combinat/symmetric_group_algebra.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index d2db0de3a21..c9fd45f4012 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1950,8 +1950,8 @@ def _dft_modular(self): EXAMPLES:: - sage: GF3S3 = SymmetricGroupAlgebra(GF(2),3) - sage: GF3S3._dft_modular() + sage: GF2S3 = SymmetricGroupAlgebra(GF(2),3) + sage: GF2S3._dft_modular() [1 0 0 0 1 0] [0 1 0 0 0 1] [0 0 1 0 0 1] @@ -1977,7 +1977,7 @@ def _dft_modular(self): for pair in list(b): coord_vector[sym_group_list.index(pair[0])] = pair[1] change_of_basis_matrix.append(coord_vector) - return Matrix(self.base_ring(),change_of_basis_matrix) + return matrix(self.base_ring(),change_of_basis_matrix) def epsilon_ik(self, itab, ktab, star=0, mult='l2r'): r""" From 156e9aa34957fc2b9a1c33aff20879696855cf5c Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Fri, 5 Apr 2024 13:13:25 -0400 Subject: [PATCH 11/15] use transpose to get matrix of coordinate vectors --- src/sage/combinat/symmetric_group_algebra.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index c9fd45f4012..6b307dd122a 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1977,7 +1977,7 @@ def _dft_modular(self): for pair in list(b): coord_vector[sym_group_list.index(pair[0])] = pair[1] change_of_basis_matrix.append(coord_vector) - return matrix(self.base_ring(),change_of_basis_matrix) + return matrix(self.base_ring(),change_of_basis_matrix).transpose() def epsilon_ik(self, itab, ktab, star=0, mult='l2r'): r""" From 01793f2ed0cc8b8f8bf92ae8072bc06faff1e571 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Fri, 5 Apr 2024 19:36:47 -0400 Subject: [PATCH 12/15] Update src/sage/combinat/symmetric_group_algebra.py remove the self-reference to .dft(). just state that it's computing the DFT when the characteristic divides the order of the group. Co-authored-by: Sebastian A. Spindler <153911337+S17A05@users.noreply.github.com> --- src/sage/combinat/symmetric_group_algebra.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index 6b307dd122a..30a7d0eda4e 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1945,8 +1945,7 @@ def _dft_seminormal(self, mult='l2r'): def _dft_modular(self): """ - Return the discrete Foruier transform when the characterisc divides the order of the group. - The usual .dft() throws ZeroDivisionError when p|n. + Return the discrete Foruier transform when the characteristic divides the order of the group. EXAMPLES:: From 327b3b449cc40681e29e20b2a220e555d4029431 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Fri, 5 Apr 2024 19:37:55 -0400 Subject: [PATCH 13/15] Update src/sage/combinat/symmetric_group_algebra.py Co-authored-by: Sebastian A. Spindler <153911337+S17A05@users.noreply.github.com> --- src/sage/combinat/symmetric_group_algebra.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index 30a7d0eda4e..56f2ba26708 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1950,7 +1950,7 @@ def _dft_modular(self): EXAMPLES:: sage: GF2S3 = SymmetricGroupAlgebra(GF(2),3) - sage: GF2S3._dft_modular() + sage: GF2S3.dft(form="modular") [1 0 0 0 1 0] [0 1 0 0 0 1] [0 0 1 0 0 1] From 2c83a02def8751e1c37fd541a1b4d4f77eaf958f Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Fri, 5 Apr 2024 20:30:39 -0400 Subject: [PATCH 14/15] Update symmetric_group_algebra.py --- src/sage/combinat/symmetric_group_algebra.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index 56f2ba26708..8cdeba4c474 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1885,7 +1885,7 @@ def seminormal_basis(self, mult='l2r'): basis.append(self.epsilon_ik(t1, t2, mult=mult)) return basis - def dft(self, form="seminormal", mult='l2r'): + def dft(self, mult='l2r'): """ Return the discrete Fourier transform for ``self``. @@ -1907,12 +1907,10 @@ def dft(self, form="seminormal", mult='l2r'): [ 1 -1/2 1 -1/2 -1/2 -1/2] [ 1 -1 -1 1 1 -1] """ - if form == "seminormal": - return self._dft_seminormal(mult=mult) - if form == "modular": + if self.base_ring().characteristic().divides(len(self.group())): return self._dft_modular() else: - raise ValueError("invalid form (= %s)" % form) + return self._dft_seminormal(mult=mult) def _dft_seminormal(self, mult='l2r'): """ @@ -1946,6 +1944,7 @@ def _dft_seminormal(self, mult='l2r'): def _dft_modular(self): """ Return the discrete Foruier transform when the characteristic divides the order of the group. + See [Mur1983]_ for contrstruction of central primitive orthogonal idempotents. EXAMPLES:: From 2fa1ab68eb30ef4c25e935de9b55f1cd1a617b49 Mon Sep 17 00:00:00 2001 From: Jackson Walters Date: Fri, 5 Apr 2024 20:43:25 -0400 Subject: [PATCH 15/15] add commentary explaining the DFT in this case remove form from argument --- src/sage/combinat/symmetric_group_algebra.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sage/combinat/symmetric_group_algebra.py b/src/sage/combinat/symmetric_group_algebra.py index 8cdeba4c474..c2549728256 100644 --- a/src/sage/combinat/symmetric_group_algebra.py +++ b/src/sage/combinat/symmetric_group_algebra.py @@ -1945,11 +1945,14 @@ def _dft_modular(self): """ Return the discrete Foruier transform when the characteristic divides the order of the group. See [Mur1983]_ for contrstruction of central primitive orthogonal idempotents. + For each idempotent e_i we have a projection v |--> v*e_i. This is a homomorphism. + We choose a basis for each submodule spanning by {\sigma*e_i | \sigma \in S_n}. + The change-of-basis from the standard basis {\sigma}_\sigma is returned. EXAMPLES:: sage: GF2S3 = SymmetricGroupAlgebra(GF(2),3) - sage: GF2S3.dft(form="modular") + sage: GF2S3.dft() [1 0 0 0 1 0] [0 1 0 0 0 1] [0 0 1 0 0 1]