Giter Club home page Giter Club logo

aidevnn / fastgoat Goto Github PK

View Code? Open in Web Editor NEW
12.0 2.0 1.0 3.85 MB

What C# can do for studying Finite Groups, quotient groups, semi-direct products, homomorphisms, automorphisms group, characters table, minimalistic rings and fields manipulations, polynomials factoring, fields extensions and many more...

License: MIT No Attribution

C# 100.00%
finite-groups abelian-groups quotient-groups permutations semi-direct-product csharp homomorphisms automorphism-group galois-group polynomial-factoring

fastgoat's Introduction

FastGoat

What C# can do for studying Finite Groups, abelians or not, quotient groups, direct products or semi-direct products, homomorphisms, automorphisms group, with minimalistic manipulations for rings, fields, numbers, polynomials factoring, field extensions, algebraics numbers and many more...

Example

Searching semi-direct product $C_7 \rtimes C_3$ in $\textbf{S}_7$

GlobalStopWatch.Restart();
var s7 = new Sn(7);
var a = s7[(1, 2, 3, 4, 5, 6, 7)];
var allC3 = s7.Where(p => (p ^ 3) == s7.Neutral()).ToArray();
var b = allC3.First(p => Group.GenerateElements(s7, a, p).Count() == 21);
GlobalStopWatch.Stop();

Console.WriteLine("|S7|={0}, |{{b in S7 with b^3 = 1}}| = {1}",s7.Count(), allC3.Count());
Console.WriteLine("First Solution |HK| = 21 : h = {0} and k = {1}", a, b);
Console.WriteLine();

var h = Group.Generate("H", s7, a);
var g21 = Group.Generate("G21", s7, a, b);
DisplayGroup.Head(g21);
DisplayGroup.Head(g21.Over(h));
GlobalStopWatch.Show("Group21");

will output

|S7|=5040, |{b in S7 with b^3 = 1}| = 351
First Solution |HK| = 21 : h = [(1 2 3 4 5 6 7)] and k = [(2 3 5)(4 7 6)]

|G21| = 21
Type        NonAbelianGroup
BaseGroup   S7

|G21/H| = 3
Type        AbelianGroup
BaseGroup   G21/H
Group           |G21| = 21
NormalSubGroup  |H| = 7

# Group21 Time:113 ms

Another Example

Comparing the previous results with the group presented by $\langle (a,\ b) \ | \ a^7=b^3=1,\ a^2=bab^{-1} \rangle$

GlobalStopWatch.Restart();
var wg = new WordGroup("a7, b3, a2 = bab-1");
GlobalStopWatch.Stop();

DisplayGroup.Head(wg);
var n = Group.Generate("<a>", wg, wg["a"]);
DisplayGroup.Head(wg.Over(n));
GlobalStopWatch.Show($"{wg}");
Console.WriteLine();

will produce

|WG[a,b]| = 21
Type        NonAbelianGroup
BaseGroup   WG[a,b]

|WG[a,b]/<a>| = 3
Type        AbelianGroup
BaseGroup   WG[a,b]/<a>
Group           |WG[a,b]| = 21
NormalSubGroup  |<a>| = 7

# WG[a,b] Time:42 ms

Semidirect product using group action

Another way for the previous example

GlobalStopWatch.Restart();
var c7 = new Cn(7);
var c3 = new Cn(3);
var g21 = Group.SemiDirectProd(c7, c3);
GlobalStopWatch.Stop();

var n = Group.Generate("N", g21, g21[1, 0]);
DisplayGroup.HeadSdp(g21);
DisplayGroup.Head(g21.Over(n));
GlobalStopWatch.Show("Group21");

will output

|C7 x: C3| = 21
Type        NonAbelianGroup
BaseGroup    C7 x C3
NormalGroup  |C7| = 7
ActionGroup  |C3| = 3

Action FaithFull
g=0 y(g) = (0->0, 1->1, 2->2, 3->3, 4->4, 5->5, 6->6)
g=1 y(g) = (0->0, 1->2, 2->4, 3->6, 4->1, 5->3, 6->5)
g=2 y(g) = (0->0, 1->4, 2->1, 3->5, 4->2, 5->6, 6->3)

|(C7 x: C3)/N| = 3
Type        AbelianGroup
BaseGroup   (C7 x: C3)/N
Group           |C7 x: C3| = 21
NormalSubGroup  |N| = 7

# Group21 Time:1 ms

Matrix form of the group $C_7 \rtimes C_3$

Expressing the group $C_7 \rtimes C_3$ in $\textbf{GL}(2,\mathbb{F}_7)$

var gl27 = FG.GL2p(7);
var g21mat = Group.IsomorphicSubgroup(gl27, g21);
DisplayGroup.HeadGenerators(g21mat);

will output

|C7 x: C3| = 21
Type        NonAbelianGroup
BaseGroup   GL(2,7)
SuperGroup  |GL(2,7)| = 2016

Generators of C7 x: C3
gen1 of order 3
[2, 0]
[0, 1]

gen2 of order 7
[1, 1]
[0, 1]

Characters Table

Displaying characters table for the group $C_7 \rtimes C_3$ in $\textbf{S}_7$

FG.CharacterTable(g21).DisplayCells();

will output

|C7 x: C3| = 21
Type        NonAbelianGroup
BaseGroup   C7 x C3

[Class      1   3a   3b              7a              7b]
[ Size      1    7    7               3               3]
[                                                      ]
[  Ꭓ.1      1    1    1               1               1]
[  Ꭓ.2      1   ξ3  ξ3²               1               1]
[  Ꭓ.3      1  ξ3²   ξ3               1               1]
[  Ꭓ.4      3    0    0  -1/2 - 1/2·I√7  -1/2 + 1/2·I√7]
[  Ꭓ.5      3    0    0  -1/2 + 1/2·I√7  -1/2 - 1/2·I√7]
All i,                 Sum[g](Xi(g)Xi(g^−1)) = |G|      : True
All i <> j,            Sum[g](Xi(g)Xj(g^−1)) =  0       : True
All g, h in Cl(g),     Sum[r](Xr(g)Xr(h^−1)) = |Cl(g)|  : True
All g, h not in Cl(g), Sum[r](Xr(g)Xr(h^−1)) =  0       : True

Polynomial with Galois group

Computing Galois Group of irreductible polynomial $P=X^7-8X^5-2X^4+16X^3+6X^2-6X-2$ from GroupName website

Ring.DisplayPolynomial = MonomDisplay.StarCaret;
var x = FG.QPoly('X');
var P = x.Pow(7) - 8 * x.Pow(5) - 2 * x.Pow(4) + 16 * x.Pow(3) + 6 * x.Pow(2) - 6 * x - 2; // GroupNames website
GaloisApplicationsPart2.GaloisGroupChebotarev(P, details: true);

will output

f = X^7 - 8*X^5 - 2*X^4 + 16*X^3 + 6*X^2 - 6*X - 2
Disc(f) = 1817487424 ~ 2^6 * 73^4
#1   P = 3 shape (7)
#2   P = 5 shape (1, 3, 3)
#3   P = 7 shape (7)
#4   P = 11 shape (1, 3, 3)
#5   P = 13 shape (1, 3, 3)
#6   P = 17 shape (7)
#7   P = 19 shape (1, 3, 3)
#8   P = 23 shape (1, 3, 3)
#9   P = 29 shape (1, 3, 3)
#10  P = 31 shape (1, 3, 3)
actual types
    [(7), 3]
    [(1, 3, 3), 7]
expected types
    [(7), 6]
    [(1, 3, 3), 14]
    [(1, 1, 1, 1, 1, 1, 1), 1]
Distances
    { Name = F_21(7) = 7:3, order = 21, dist = 0.6666666666666664 }
    { Name = F_42(7) = 7:6, order = 42, dist = 8.8 }
    { Name = L(7) = L(3,2), order = 168, dist = 25.6 }
    { Name = A7, order = 2520, dist = 380 }
    { Name = S7, order = 5040, dist = 538.6666666666666 }

P = X^7 - 8*X^5 - 2*X^4 + 16*X^3 + 6*X^2 - 6*X - 2
Gal(P) = F_21(7) = 7:3
|F_21(7) = 7:3| = 21
Type        NonAbelianGroup
BaseGroup   S7
SuperGroup  |Symm7| = 5040

Illustration

DisplayGroup.HeadElementsCayleyGraph(g21, gens: [g21["a"], g21["b-1"]]);

will output

Cayley graph Group C7x:C3

Galois Theory

Galois Group of polynomial $P = X^5 + X^4 - 4X^3 - 3X^2 + 3X + 1$

Ring.DisplayPolynomial = MonomDisplay.StarCaret;
var x = FG.QPoly('X');
var P = x.Pow(5) + x.Pow(4) - 4 * x.Pow(3) - 3 * x.Pow(2) + 3 * x + 1;
var roots = IntFactorisation.AlgebraicRoots(P, details: true);
var gal = GaloisTheory.GaloisGroup(roots, details: true);
DisplayGroup.AreIsomorphics(gal, FG.Abelian(5));

will output

[...]

f = X^5 + X^4 - 4*X^3 - 3*X^2 + 3*X + 1 with f(y) = 0
Square free norm : Norm(f(X + 2*y)) = x^25 - 5*x^24 - 98*x^23 + 503*x^22 + 3916*x^21 - 20988*x^20 - 82808*x^19 + 476245*x^18 + 1001759*x^17 - 6482223*x^16 - 6888926*x^15 + 55077950*x^14 + 23535811*x^13 - 295014199*x^12 - 8852570*x^11 + 984611573*x^10 - 207998384*x^9 - 1981105500*x^8 + 676565912*x^7 + 2253157335*x^6 - 871099834*x^5 - 1278826318*x^4 + 467945878*x^3 + 268636799*x^2 - 89574789*x + 1746623
         = (x^5 - x^4 - 26*x^3 + 47*x^2 + 47*x - 1) * (x^5 - x^4 - 26*x^3 + 25*x^2 + 91*x - 67) * (x^5 - x^4 - 26*x^3 + 25*x^2 + 157*x - 199) * (x^5 - x^4 - 26*x^3 - 19*x^2 + 113*x + 131) * (x^5 - x^4 - 4*x^3 + 3*x^2 + 3*x - 1)

X^5 + X^4 - 4*X^3 - 3*X^2 + 3*X + 1 = (X + y^4 + y^3 - 3*y^2 - 2*y + 1) * (X - y^4 + 4*y^2 - 2) * (X - y^3 + 3*y) * (X - y^2 + 2) * (X - y)
Are equals True

Polynomial P = X^5 + X^4 - 4*X^3 - 3*X^2 + 3*X + 1
Factorization in Q(α)[X] with P(α) = 0
    X - α
    X - α^2 + 2
    X - α^3 + 3*α
    X + α^4 + α^3 - 3*α^2 - 2*α + 1
    X - α^4 + 4*α^2 - 2

|Gal( Q(α)/Q )| = 5
Type        AbelianGroup
BaseGroup   S5

Elements
(1)[1] = []
(2)[5] = [(1 2 5 3 4)]
(3)[5] = [(1 3 2 4 5)]
(4)[5] = [(1 4 3 5 2)]
(5)[5] = [(1 5 4 2 3)]

Gal( Q(α)/Q ) IsIsomorphicTo C5 : True

Computing $\bf{Gal}(\mathbb{Q}(\sqrt{2}, \sqrt{3})/\mathbb{Q})=\mathbf{C_2}\times\mathbf{C_2}$

Ring.DisplayPolynomial = MonomDisplay.Caret;
var x = FG.QPoly('X');
var (X, _) = FG.EPolyXc(x.Pow(2) - 2, 'a');
var (minPoly, a0, b0) = IntFactorisation.PrimitiveElt(X.Pow(2) - 3);
var roots = IntFactorisation.AlgebraicRoots(minPoly);
Console.WriteLine("Q(√2, √3) = Q(α)");
var gal = GaloisTheory.GaloisGroup(roots, details: true);
DisplayGroup.AreIsomorphics(gal, FG.Abelian(2, 2));

will output

Q(√2, √3) = Q(α)
Polynomial P = X^4 - 10*X^2 + 1
Factorization in Q(α)[X] with P(α) = 0
    X + α
    X - α
    X + α^3 - 10*α
    X - α^3 + 10*α

|Gal( Q(α)/Q )| = 4
Type        AbelianGroup
BaseGroup   S4

Elements
(1)[1] = []
(2)[2] = [(1 2)(3 4)]
(3)[2] = [(1 3)(2 4)]
(4)[2] = [(1 4)(2 3)]

Gal( Q(α)/Q ) IsIsomorphicTo C2 x C2 : True

With $\alpha^4-2 = 0,\ \bf{Gal}(\mathrm{Q}(\alpha, \mathrm{i})/\mathrm{Q}) = \mathbf{D_4}$

Ring.DisplayPolynomial = MonomDisplay.Caret;
var x = FG.QPoly('X');
var (X, i) = FG.EPolyXc(x.Pow(2) + 1, 'i');
var (minPoly, _, _) = IntFactorisation.PrimitiveElt(X.Pow(4) - 2);
var roots = IntFactorisation.AlgebraicRoots(minPoly);
Console.WriteLine("With α^4-2 = 0, Q(α, i) = Q(β)");
var gal = GaloisTheory.GaloisGroup(roots, primEltChar: 'β', details: true);
DisplayGroup.AreIsomorphics(gal, FG.Dihedral(4));

will output

With α^4-2 = 0, Q(α, i) = Q(β)
Polynomial P = X^8 + 4*X^6 + 2*X^4 + 28*X^2 + 1
Factorization in Q(β)[X] with P(β) = 0
    X + β
    X - β
    X + 5/12*β^7 + 19/12*β^5 + 5/12*β^3 + 139/12*β
    X + 5/24*β^7 - 1/24*β^6 + 19/24*β^5 - 5/24*β^4 + 5/24*β^3 - 13/24*β^2 + 127/24*β - 29/24
    X + 5/24*β^7 + 1/24*β^6 + 19/24*β^5 + 5/24*β^4 + 5/24*β^3 + 13/24*β^2 + 127/24*β + 29/24
    X - 5/24*β^7 - 1/24*β^6 - 19/24*β^5 - 5/24*β^4 - 5/24*β^3 - 13/24*β^2 - 127/24*β - 29/24
    X - 5/24*β^7 + 1/24*β^6 - 19/24*β^5 + 5/24*β^4 - 5/24*β^3 + 13/24*β^2 - 127/24*β + 29/24
    X - 5/12*β^7 - 19/12*β^5 - 5/12*β^3 - 139/12*β

|Gal( Q(β)/Q )| = 8
Type        NonAbelianGroup
BaseGroup   S8

Elements
(1)[1] = []
(2)[2] = [(1 2)(3 8)(4 7)(5 6)]
(3)[2] = [(1 3)(2 8)(4 6)(5 7)]
(4)[2] = [(1 4)(2 6)(3 7)(5 8)]
(5)[2] = [(1 5)(2 7)(3 6)(4 8)]
(6)[2] = [(1 8)(2 3)(4 5)(6 7)]
(7)[4] = [(1 6 8 7)(2 4 3 5)]
(8)[4] = [(1 7 8 6)(2 5 3 4)]

Gal( Q(β)/Q ) IsIsomorphicTo D8 : True

Illustration

Polynomial P=X^2-5 with Galois Group C5x:C4

References

ALGÈBRE T1 Daniel Guin, Thomas Hausberger. ALGÈBRE T1 Groupes, corps et théorie de Galois. EDP Sciences. All Chapters.

Algebra (3rd ed.) Saunders MacLane, Garrett Birkhoff. Algebra (3rd ed.). American Mathematical Society. Chapter XII.2 Groups extensions.

A Course on Finite Groups H.E. Rose. A Course on Finite Groups. Springer. 2009. All Chapters. Web Sections, Web Chapters.

A Course on Finite Groups H.E. Rose. A Course on Finite Groups. Web Sections, Web Chapters and Solution Appendix. Springer. 2009. Chapter 13. Representation and Character Theory.

GroupNames Tim Dokchitser. Group Names. Beta

GAP2022 The GAP Group. GAP -- Groups, Algorithms, and Programming. Version 4.12.0; 2022.

Paper (pdf) Ken Brown. Mathematics 7350. Cornell University. The Todd–Coxeter procedure

Conway polynomials Frank Lübeck. Conway polynomials for finite fields Online data

AECF Alin Bostan, Frédéric Chyzak, Marc Giusti, Romain Lebreton, Grégoire Lecerf, Bruno Salvy, Éric Schost. Algorithmes Efficaces en Calcul Formel. Édition web 1.1, 2018 Chapitre IV Factorisation des polynômes.

hal-01444183 Xavier Caruso Computations with p-adic numbers. Journées Nationales de Calcul Formel, In press, Les cours du CIRM. 2017. Several implementations of p-adic numbers

Algebraic Factoring Barry Trager Algebraic Factoring and Rational Function Integration. Laboratory for Computer Science, MIT. 1976. Norms and Algebraic Factoring

Bases de Gröbner Jean-Charles Faugere Résolution des systèmes polynômiaux en utilisant les bases de Gröbner. INRIA (POLSYS) / UPMC / CNRS/ LIP6. (JNCF) 2015

Ideals, Varieties, and Algorithms David A. Cox, John Little, Donal O’Shea Ideals, Varieties, and Algorithms. Springer. 4th Edition. 2015. Chapter 5. Polynomial and Rational Functions on a Variety

Charaktertheorie Jun.-Prof. Dr. Caroline Lassueur Character Theory of Finite Groups. TU Kaiserslautern, SS2020. Chapter 6. Induction and Restriction of Characters

Wikipedia Wikipedia. The Free Encyclopedia. Many algorithms and proofs

WolframCloud Wolfram Research. WOLFRAM CLOUD Integrated Access to Computational Intelligence 2023 Wolfram Research, Inc.

Pari/GP The PARI Group. PARI/GP Number Theory-oriented Computer Algebra System. Bordeaux. Version 2.15.x; 2020-2022.

milneFT Milne, James S. Fields and Galois Theory. Ed web v5.10, 2022. Chapter 4. Computing Galois Groups.

ChatGPT OpenAI. ChatGPT August 3, 2023 Version3.5 Free Research Preview.

fplll The FPLLL development team. A lattice reduction library may2021 Version 5.4.1

arb F.Johansson Arb a C library for arbitrary-precision ball arithmetic june2022 Version 2.23

milneCFT Milne, James S. Class Field Theory. Ed web v4.03, 2020. Chapter 2. The Cohomology of Groups.

Cohomology of Finite Groups Alejandro Adem, R. James Milgram. Cohomology of Finite Groups Springer. Second Edition 2004. Chapter 1. Group Extensions, Simple Algebras and Cohomology

arXiv:math/0010134 Florentin Smarandache, PhD Associate Professor Chair of Department of Math & Sciences INTEGER ALGORITHMS TO SOLVE DIOPHANTINE LINEAR EQUATIONS AND SYSTEMS. University of New Mexico nov 2007.

RSW1999 Iain Raeburn, Aidan Sims, and Dana P.Williams TWISTED ACTIONS AND OBSTRUCTIONS IN GROUP COHOMOLOGY. Germany, March 8–12, 1999.

A000001 OEIS. The On-Line Encyclopedia of Integer Sequences. A000001 Number of groups of order n.

relators John J. CANNON. Construction of defining relators for finite groups. Department of Pure Mathematics, University of Sydney. Discrete Mathematics 5 (1973), North-Holland Publishing Company. Construction of defining relators for finite groups. p105-129

generatorsGLnq D.E.Taylor. Pairs of Generators for Matrix Groups. Department of Pure Mathematics The University of Sydney Australia 2006. arXiv:2201.09155v1

Groups and Symmetries From Finite Groups to Lie Groups Yvette Kosmann-Schwarzbach, Stephanie Frank Singer Groups and Symmetries From Finite Groups to Lie Groups. Springer. 2th Edition. 2022. Chapter 2. Representations of Finite Groups

Algorithms in Invariant Theory Bernd Sturmfels. Algorithms in Invariant Theory Second edition. 2008 Springer-Verlag/Wien. Chapter2 Invariant theory of finite groups.

ntbv2 Victor Shoup. A Computational Introduction to Number Theory and Algebra. Second edition. December 2008 Cambridge University Press. New York University Chapter20 Algorithms for finite fields.

pslqm2 David H. Bailey. The two-level multipair PSLQ algorithm. May 2, 2024 PSLQM2.

fastgoat's People

Contributors

aidevnn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

fastgoat's Issues

All Automorphisms of any tiny groups

This method takes generators as arguments, then create the group generated by these elements and for each generators, search all same orders elements in this group, try to create valid automorphism with these tuples and then generate the group which has for generators the previous valid automorphisms.

It is easy to verify for Cn monogenic group which has only one generator through euler function, but for Symmetric Group subgroup or for cartesian product of Cn, it will difficult and needs to use more things to validate this method.

Unit tests will be restricted to well known groups.

public static ConcreteGroup<Automorphism<T>> Aut<T>(string name, T e, params T[] others) where T : struct, IElt<T>
{
var g = Generate(name, e, others);
var bgAut = Aut(g);
var gens = others.Prepend(e).Distinct().ToArray();
var gByOrders = g.ElementsOrders.GroupBy(kp => kp.Value)
.ToDictionary(a => a.Key, a => a.Select(kp => kp.Key).ToArray());
var gensPossibles = gens.ToDictionary(a => a, a => gByOrders[g.ElementsOrders[a]]);
var allTuples = gensPossibles.Select(kp => kp.Value.Select(a => (kp.Key, a))).ToArray();
List<Dictionary<T, T>> allMaps = new();
foreach (var tuples in allTuples)
{
if (allMaps.Count == 0)
{
allMaps = tuples.Select(t => new Dictionary<T, T>() { [t.Key] = t.a }).ToList();
continue;
}
List<Dictionary<T, T>> tmpMaps = new();
foreach (var t in tuples)
{
foreach (var map in allMaps)
{
var map0 = new Dictionary<T, T>(map) { [t.Key] = t.a };
tmpMaps.Add(map0);
}
}
allMaps.Clear();
allMaps.AddRange(tmpMaps);
}
var allAuts = allMaps.Select(pMap => AutomorphismMap(g, pMap)).Where(map => map.Count == g.Count())
.Select(map => new Automorphism<T>(bgAut, map))
.ToHashSet();
var autG = Generate($"Aut[{name}]", allAuts.First(), allAuts.Skip(1).ToArray());
return autG;

IGroup and IElt Interface Model limitations.

In the current interface model, Homomorphism, LeftCoset and Relators are not well implemented, that makes the project hard to maintain and it doesnt cover Undergraduated level.

Introducing Monoid, Set Theory and Magma Interfaces can makes the model more robust and more structured.

Choosing an operation by automorphism for Semidirect product

var g1 = Group.SemiDirectProd(Product.Generate(new Cn(3), new Cn(3)), new Cn(2));

Running this example in console

var g1 = Group.SemiDirectProd(Product.Generate(new Cn(3), new Cn(3)), new Cn(2));
DisplayGroup.HeadSdp(g1);
Console.WriteLine(g1.ElementsOrders.Values.Ascending().Glue(", "));

will output

|(C3 x C3) x: C2| = 18
Type        NonAbelianGroup
BaseGroup    C3 x C3 x Z2
NormalGroup  |C3 x C3| = 9
ActionGroup  |C2| = 2

Actions
g=0 y(g) = ((0, 0)->(0, 0), (0, 1)->(0, 1), (0, 2)->(0, 2), (1, 0)->(1, 0), (1, 1)->(1, 1), (1, 2)->(1, 2), (2, 0)->(2, 0), (2, 1)->(2, 1), (2, 2)->(2, 2))
g=1 y(g) = ((0, 0)->(0, 0), (0, 1)->(1, 0), (0, 2)->(2, 0), (1, 0)->(0, 1), (1, 1)->(1, 1), (1, 2)->(2, 1), (2, 0)->(0, 2), (2, 1)->(1, 2), (2, 2)->(2, 2))

1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6

But when we try to find this group in GAP system, the result is different

gap> StructureDescription(SmallGroup(18,4));
"(C3 x C3) : C2"
gap> SortedList(List(SmallGroup(18,4),Order));
[ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3 ]

The difference comes from the choose of the operation by automorphism which is actually arbitrary.

In GAP

gap> StructureDescription(SmallGroup(18,3));
"C3 x S3"
gap> SortedList(List(SmallGroup(18,3),Order));
[ 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6 ]

Rewriting the previous C# code

var n = Product.Generate(new Cn(3), new Cn(3));
var g = new Cn(2);
var thetas = Group.AllOpsByAutomorphisms(g, n);
foreach (var theta in thetas)
{
    var g1 = new SemiDirectProduct<Ep2<ZnInt, ZnInt>, ZnInt>("G", n, theta, g);
    DisplayGroup.HeadSdp(g1);
    Console.WriteLine(g1.ElementsOrders.Values.Ascending().Glue(", "));
}

Will produce

...
...
...
|G| = 18
Type        NonAbelianGroup
BaseGroup    C3 x C3 x Z2
NormalGroup  |C3 x C3| = 9
ActionGroup  |C2| = 2

Actions
g=0 y(g) = ((0, 0)->(0, 0), (0, 1)->(0, 1), (0, 2)->(0, 2), (1, 0)->(1, 0), (1, 1)->(1, 1), (1, 2)->(1, 2), (2, 0)->(2, 0), (2, 1)->(2, 1), (2, 2)->(2, 2))
g=1 y(g) = ((0, 0)->(0, 0), (0, 1)->(0, 2), (0, 2)->(0, 1), (1, 0)->(2, 0), (1, 1)->(2, 2), (1, 2)->(2, 1), (2, 0)->(1, 0), (2, 1)->(1, 2), (2, 2)->(1, 1))

1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
...
...
...

There is problem when building automorphism and also a bad comprehension of the subject.

Conway Polynomials computation is invalid

public static void Run()
{
MyPoly(2, 1);
MyPoly(2, 2);
MyPoly(2, 3);
MyPoly(2, 4);
MyPoly(2, 5);
MyPoly(3, 1);
MyPoly(3, 2);
MyPoly(3, 2);
MyPoly(3, 3);
MyPoly(3, 4); // My Poly p=3 n=4 : 2 + 2x + x^4 ### Conway Poly p=3 n=4 : 2 + 2x^3 + x^4
MyPoly(3, 5);
MyPoly(5, 1);
MyPoly(5, 2);
MyPoly(5, 3);
MyPoly(5, 4); // My Poly p=5 n=4 : 2 + 3x + x^2 + x^4 ### Conway Poly p=5 n=4 : 2 + 4x + 4x^2 + x^4
MyPoly(7, 1);
MyPoly(7, 2);
MyPoly(7, 3); // My Poly p=7 n=3 : 2 + 3x + x^3 ### Conway Poly p=7 n=3 : 4 + 6x^2 + x^3
}

Some problems occure when computing Conway polynomial.

Sylow theorems and pGroup

Actually, morphisms are computed only for monogenics groups or external product of monogenics groups or few cases of internal products of monogenics groups.
May be taking a look on the pGroup will resolves the problem of generators of small groups.

Dicyclics 30 and 42, wordgroup and semi-direct product are not isomorphic

Dicyclics 30 and 42 bugs, wordgroup and semi-direct product are not isomorphic for the first faithfull action which is choosen by default for semi-direct product.

{
for (int i = 2; i < 51; i++)
{
var g1 = Group.DiCyclicSdp(i);
var g2 = Group.DiCyclic(i);
if (g1.IsIsomorphicTo(g2))
continue;
DisplayGroup.AreIsomorphics(g2, g1);
DisplayGroup.HeadOrders(g1);
DisplayGroup.HeadOrders(g2);
// Dic30 && Dic42 errors
}
}

Semi-direct product is faster than word group or than permutation group but has many problems for choosing the right group action.

Method name

public static List<Dictionary<T2, Automorphism<T1>>> AllHomomorphisms<T1, T2>(IGroup<T2> bg, IGroup<T1> bn)

This method computes all homomorphism between a group and the automorphism group of the second argument. It must be rewritten.

WordGroup Challenges

Two challenges for deepening about generators.

  1. How to create computationally an isomorphic WordGroup given any other UserGroup ?
  2. How to create WordGroup from FreeGroup using Normal subgroup of relators and without Todd Coxeter procedure ?

Cyclotomic Field Cnf Elements Simplification

The current implementation for the simplification of Cyclotomic Field Cnf elements is not efficient, especially for numbers $$\displaystyle A_{cnf} = \sum_{i \in I} a_i ξ(m)^i$$ where $m$ is not prime.

This inefficiency is causing the process to be slow. Resolving this issue will enable a more effective pretty print for the character table using the trace property of $χ_r (g_i)$.

New interface for G Module N

The new interface for manipulating G-Module N, when N is an abelian group, is cumbersome and not suitable for computation of extensions of N by G. It also can't be used for modeling character computations, but it only simplifies reading. Restricting computation for N abelian, or the center of N, becomes mandatory since it corrects many bugs occurred when computing extensions of Dihedral Group D8 by C2.

Perhaps it would be better to use the previous object for manipulating polynomials of multiple indeterminates over the finite field Fq. Reducing systems could be done with Groebner, which is already possible and tested for trivial action, and group action could be possible through permutations of unknowns but it needs to be tested for evidence.

The book, Cohomology of Finite Group from Alejandro Adem and R.James Milgram will be very useful for that. The subject is becoming challenging, profound, and captivating.

Memory issues

JetBrains is throwing a lot of memory issues.

Example at

var tmpCycles = new Dictionary<T, ReadOnlyDictionary<T, int>>(allCycles);
allCycles.Clear();
var done = false;
foreach (var (e1, cycle1) in tmpCycles)

which can be resolved

var tmpCycles = allCycles.Select(p => (p.Key, p.Value));
allCycles.Clear();
var done = false;
foreach (var (e1, cycle1) in tmpCycles)

But a lot of other issues remains.

Issue with ±1 on many parameters for BCH codes

When working on BCH codes using the Berlekamp Massey algorithm for decoding, everything is working well except for a minor issue with ±1 on many parameters such as the size of the word to encode, the degree of the syndrome polynomial, and the size of detected errors. Some comments and more relevant naming are also needed for better understanding.

For example in the below line, there is a confusion in the range for j.

static KPoly<EPoly<ZnInt>> Syndrom(KPoly<ZnInt> m, Fq fq, int delta)
{
var b = fq.X;
var X = FG.KPoly('X', b);
return (delta).Range(1).Select(j => m.Substitute(b.Pow(j)) * X.Pow(j)).Aggregate((e0, e1) => e0 + e1);
}

Cayley table

Cayley table is an easy but powerful tool for studying finite group and it must be added, at least for better performance.

Splitting problems

SplittingGroups(v, d8, c2);
SplittingGroups(c2, d8, v);
SplittingGroups(c2, d8, c4);
SplittingGroups(c4, d8, c2);

SplittingGroups(c2, q8, c4);
SplittingGroups(c4, q8, c2);
SplittingGroups(v, q8, c2);
SplittingGroups(c2, q8, v);

When running this code, some results are hard to understand and they need deepening in this question.

Algebraic Integer Relation with LLL

public static ConcreteGroup<EPoly<Rational>> GaloisGroupLLL(KPoly<Rational> P, int O1, int O2)
{
Console.WriteLine(P);
GlobalStopWatch.AddLap();
var nRoots = FG.NRoots(P.ToBcPoly(O2));
GlobalStopWatch.Show("Roots");
var alpha = nRoots[0];
return GaloisGroupNumericRoots(alpha, nRoots, P, O1);
}
public static void Example3()
{
var x = FG.QPoly();
GlobalStopWatch.Restart();
var galGr = GaloisGroupLLL(x.Pow(6) + 108, O1: 50, O2: 75); // S3
DisplayGroup.HeadElements(galGr);
var X = FG.KPoly('X', galGr.Neutral());
Console.WriteLine("Prod[X - ri] = {0}", galGr.Aggregate(X.One, (acc, r) => acc * (X - r)));
GlobalStopWatch.Show("END"); // Time:242 ms
}

O1 represents the minimum number of digits required in the lattice, while O2 represents the maximum number of digits required for precise computation before populating the lattice, both of which are typically determined through trial and error. However, a more efficient approach involves using a minorant to predict O1 and O2 based on the polynomial degree and its coefficients. Although this method may be challenging, it represents a significant improvement for future applications.

JetBrains Rider AI Assistant

I'm thrilled to announce that the latest Early Access Program (EAP) release as of November 2023 now supports both .NET 8 and the AI Assistant. I'm looking forward to utilizing these updated features in my development work.

Redundant possibilities

The method below is incorrect for counting all possible values for a map with symbolic unknowns. It includes redundant possibilities that need to be eliminated.

public static int NbPossibilities<Tn, Tg>(CrMap<Tn, Tg> map)
where Tg : struct, IElt<Tg>
where Tn : struct, IElt<Tn>
{
var prod = 1;
var map0 = new CrMap<Tn, Tg>(map.ToDictionary(e => e.Key, e => e.Value));
while (map0.Any(e => !e.Value.IsZero()))
{
var sys = SysEquations(map0);
if (sys.Length == 0)
break;
var (eq, mod, invs, ords, lt, lc) = sys.First();
prod *= ords[lc.K];
var xi = lt.ContentIndeterminates.First();
map0 = new(map0.ToDictionary(e => e.Key, e => e.Value.Substitute(eq.Zero, xi).Simplify()));
}
return prod;
}

Advanced material for Undergraduate

The project offers a plethora of promising tools. However, their abundance can sometimes lead to confusion, and they aren't always effective. I believe it's crucial for undergraduates to master these complex tools to successfully complete their mathematics proofs or to enhance their efficiency during graduate studies and after. This issue aims to motivate users to experiment with these materials and source code before completing their undergraduate level.

Group Morphism

A new functionality for studying group morphisms will be probabely the last step for releasing the first candidat v1.0 of this project.

Bug SemiDirect Product Klein by Symm3 isnt isomorphic to Symm4

Symmetric 4 group is isomorphic to Holomorph group of C2 x C2.

But the following code will output an invalid result.

var s4 = new Symm(4);
var V = Group.Generate("V", s4, s4[(1, 2), (3, 4)], s4[(1, 3), (2, 4)]);
var autV = Group.AutomorphismGroup(V);
DisplayGroup.AreIsomorphics(autV, new Symm(3));
var homs = Group.AllHomomorphisms(autV, autV);
var allSdp = homs.Select((theta, i) => Group.SemiDirectProd($"(V x: Aut[V])[{i}]", V, theta, autV)).ToList();
allSdp.ForEach(holV => DisplayGroup.AreIsomorphics(holV, s4));

output

Aut[V] IsIsomorphicTo S3 : True
...
(V x: Aut[V])[2] IsIsomorphicTo Symm4 : False
(V x: Aut[V])[3] IsIsomorphicTo Symm4 : False
...

Latin squares is not enough

FastGoat/FastGoat/Group.cs

Lines 190 to 204 in 3b0cf27

public static bool IsGroup<T>(T[,] table) where T : struct, IElt<T>
{
var n = table.GetLength(0);
if (n != table.GetLength(1))
return false;
var lt = Enumerable.Range(0, n).ToArray();
var group = lt.Select(i => table[0, i]).ToHashSet();
if (group.Count != n)
return false;
var checkRows = lt.Select(i0 => lt.Select(j0 => table[i0, j0]).ToHashSet()).All(group.SetEquals);
var checkCols = lt.Select(i0 => lt.Select(j0 => table[j0, i0]).ToHashSet()).All(group.SetEquals);
return checkRows && checkCols;
}

Associativity is not verified.

Latin square is cheap, complexity is O(n2) when Associativity is more costly O(n3)

Groups Interfaces

Interfaces for Groups are ambiguous. A primitive element is always user-defined related to a primitive user-defined group. Other computational groups are manipulating primitives elements or a tuple of primitive elements. Their base group is always the same of the neutral element base group which is at least the first requirement for their creation.

Necessary condition for isomorphism but not sufficient

public bool IsIsomorphicTo<TU>(IConcreteGroup<TU> gu) where TU : struct, IElt<TU>
{
var set0 = ElementsOrders.Values.Ascending();
var set1 = gu.ElementsOrders.Values.Ascending();
return set0.SequenceEqual(set1);
}

This condition is necessary for isomorphic groups but it is not sufficient.
A counter-example is between groups (C8 : C4) and (C4 : C8) as shown in Examples folder.

public static void NonIsomorphic()
{
var yC8C4 = U8[(C8[1], C8[5])];
var mapC8C4 = Group.PartialMap((C4[1], yC8C4));
var thetaC8C4 = Group.HomomorphismMap(C4, U8, mapC8C4);
var gC8C4 = Group.SemiDirectProd(C8, thetaC8C4, C4);
DisplayGroup.HeadSdp(gC8C4);
Console.WriteLine("Sorted Orders {0} : ({1})", gC8C4, gC8C4.ElementsOrders.Values.Ascending().Glue(", "));
var yC4C8 = U4[(C4[1], C4[3])];
var mapC4C8 = Group.PartialMap((C8[1], yC4C8));
var thetaC4C8 = Group.HomomorphismMap(C8, U4, mapC4C8);
var gC4C8 = Group.SemiDirectProd(C4, thetaC4C8, C8);
DisplayGroup.HeadSdp(gC4C8);
Console.WriteLine("Sorted Orders {0} : ({1})", gC4C8, gC4C8.ElementsOrders.Values.Ascending().Glue(", "));
Console.WriteLine();
Console.WriteLine("Isomorphic {0} {1} {2}", gC4C8, gC8C4, gC4C8.IsIsomorphicTo(gC8C4));
var homs = Group.AllHomomorphisms(gC8C4, gC4C8, true);
Console.WriteLine("Homomorphisms Count = {0}", homs.Count);
Console.WriteLine("Isomorphisms Count = {0}", homs.Count(h => h.Values.Distinct().Count() == h.Count));

which will output

|C8 x: C4| = 32
Type        NonAbelianGroup
BaseGroup    Z8 x Z4
NormalGroup  |C8| = 8
ActionGroup  |C4| = 4

Actions
g=0 y(g) = (0->0, 1->1, 2->2, 3->3, 4->4, 5->5, 6->6, 7->7)
g=1 y(g) = (0->0, 1->5, 2->2, 3->7, 4->4, 5->1, 6->6, 7->3)
g=2 y(g) = (0->0, 1->1, 2->2, 3->3, 4->4, 5->5, 6->6, 7->7)
g=3 y(g) = (0->0, 1->5, 2->2, 3->7, 4->4, 5->1, 6->6, 7->3)

Sorted Orders C8 x: C4 : (1, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8)
|C4 x: C8| = 32
Type        NonAbelianGroup
BaseGroup    Z4 x Z8
NormalGroup  |C4| = 4
ActionGroup  |C8| = 8

Actions
g=0 y(g) = (0->0, 1->1, 2->2, 3->3)
g=1 y(g) = (0->0, 1->3, 2->2, 3->1)
g=2 y(g) = (0->0, 1->1, 2->2, 3->3)
g=3 y(g) = (0->0, 1->3, 2->2, 3->1)
g=4 y(g) = (0->0, 1->1, 2->2, 3->3)
g=5 y(g) = (0->0, 1->3, 2->2, 3->1)
g=6 y(g) = (0->0, 1->1, 2->2, 3->3)
g=7 y(g) = (0->0, 1->3, 2->2, 3->1)

Sorted Orders C4 x: C8 : (1, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8)

Isomorphic C4 x: C8 C8 x: C4 True
Homomorphisms Count = 256
Isomorphisms  Count = 0

And then, this example also provide how to check computationally isomorphism between two group.

Symmetric Group 5 subgroups

// C3 : C4 subgroups and isomorphic are added by hand
var sdp12 = Group.Generate(g, g[(1, 4, 5)], g[(2, 3)], g[(4, 5)]);
var (allIm12b, allKer12b) = AllImKer(sdp12, g);
all.UnionWith(allIm12b);
all.UnionWith(allKer12b);
Console.WriteLine($"With (C3 : C4) subgroups : {all.Count()}");

Symm5 contains multiples dihedrals subgroups, D8, D10 and D12.

There is also a bug in Isomorphic methods between two groups.

Direct Product of Concrete Group

public static Gp<U1, U2> CartesianProduct<U1, U2>(IGroup<U1> g1, IGroup<U2> g2)
where U1 : struct, IElt<U1>
where U2 : struct, IElt<U2>
{
return new Gp<U1, U2>(g1, g2);
}
public static Gp<U1, U2, U3> CartesianProduct<U1, U2, U3>(IGroup<U1> g1, IGroup<U2> g2, IGroup<U3> g3)
where U1 : struct, IElt<U1>
where U2 : struct, IElt<U2>
where U3 : struct, IElt<U3>
{
return new Gp<U1, U2, U3>(g1, g2, g3);
}
public static Gp<U1, U2, U3, U4> CartesianProduct<U1, U2, U3, U4>(IGroup<U1> g1, IGroup<U2> g2, IGroup<U3> g3, IGroup<U4> g4)
where U1 : struct, IElt<U1>
where U2 : struct, IElt<U2>
where U3 : struct, IElt<U3>
where U4 : struct, IElt<U4>
{
return new Gp<U1, U2, U3, U4>(g1, g2, g3, g4);
}

Cartesian Product is only for user defined BaseGroup of interface IGroup and external Direct Product of groups cannot be made between groups from interface IConcreteGroup.

TC algorithm operations are right-coset

public IEnumerable<char> Rewrite(IEnumerable<char> w)
{
if (!w.Select(char.ToLower).All(generators.Contains))
throw new GroupException(GroupExceptionType.GroupDef);
var symbol = w.Reverse().Select(c => new Generator(c)).Aggregate(Symbol.One, (i, g) => opsTable[new OpKey(i, g)]);
return elementsTable[symbol];
}

In the algorithm, all operations are right coset, (1).a = (2), where (1) and (2) are classes, H.a = K. In every other part, operations are from left x.H = K, this is why a word is reversed before being rewrited.

public interface ILeftCoset<out T> where T : struct, IElt<T>
{
T X { get; }
IEnumerable<T> xH { get; }
}

Fixing this issue will need to rewrite all the namespace ToddCoxeter.

Group Action

Need to validate if the group action is an automorphism when creating a semidirect product to fix bugs.

Galois Group and Galois Theory improvment

The previous design was able to deal with Finite Fields but now, the current one support also Galois Group in Q[X] for small polynomials of degree 4. It can be simplified and a lot of examples can be moved to structure folder.

Direct product of Zn automorphisms group

Direct product of Zn automorphisms group Un is not possible at time, and must be resolved as soon as possible. Insted, only automorphisms group of monogenics group can be done through generators. Fixing this bugs will allow to illustrate the simple criteria Aut(Cm x CN) ~ Aut(Cm) x Aut(Cn) when m and n are coprime

public int Hash { get; } = 0;

Refactoring the files Polynomial Factorization

The files PolynomialFactorization(Part1 and Part2).cs are unreadables and need to be splitted and to be refactored.

static KMatrix<Rational> LLL(KMatrix<Rational> v)
{

LLL-Algorithm isnt illustrated in any part of examples

static KPoly<Rational>[] HenselLifting(KPoly<Rational> f, int p, int o)
{
if (!f.Coefs.Last().Equals(f.KOne) || f.Coefs.Any(c => !c.Denom.IsOne))
throw new ArgumentException();

Cannot factor non monic or non integers coefficients polynomials

The CommonNames method does not include GL(2,3)

The CommonNames method does not include GL(2,3)

{
static Leaf[] CommonNames(ConcreteGroup<TableElt> G)
{
var og = G.Count();
var orders = G.ElementsOrdersList().GroupBy(a => a)
.ToDictionary(a => a.Key, a => a.Count())
.AscendingByKey()
.GlueMap(fmt: "[{0}]:{1}");
if (og == 12 && orders == "[1]:1, [2]:3, [3]:8")
return [new Leaf(G, "A4")];
if (og == 24 && orders == "[1]:1, [2]:9, [3]:8, [4]:6")
return [new Leaf(G, "S4")];
if (G.Count() == 8 && orders == "[1]:1, [2]:1, [4]:6")
return [new Leaf(G, "Q8")];
if (G.Count() == 16 && orders == "[1]:1, [2]:1, [4]:10, [8]:4")
return [new Leaf(G, "Q16")];
if (G.Count() == 32 && orders == "[1]:1, [2]:1, [4]:18, [8]:4, [16]:8")
return [new Leaf(G, "Q32")];
if (og == 24 && orders == "[1]:1, [2]:1, [3]:8, [4]:6, [6]:8")
return [new Leaf(G, "SL(2,3)")];
if (G.Count() == 120 && orders == "[1]:1, [2]:1, [3]:20, [4]:30, [5]:24, [6]:20, [10]:24")
return [new Leaf(G, "SL(2,5)")];

and it should be added.

##############################################
################# Q8 x: S3 #################
##############################################
|Q8 x: S3| = 48
Type NonAbelianGroup
BaseGroup SL(2,3) . C2
Elements Orders : [1]:1, [2]:13, [3]:8, [4]:6, [6]:8, [8]:12
AllSubGr:55 AllConjsCl:16 AllNorms:5
Group Names
Q8 x: S3
SL(2,3) x: C2
C2 . S4

Only generic type in Structures namespace

A better design would avoid using the non-generic type ZnInt in the Structures namespace.

namespace FastGoat.Structures.GenericGroup;
public readonly struct AbelianDirectSum<T> where T : struct, IElt<T>
{
public ConcreteGroup<T> Ab { get; }
public List<(T g, int o)> Decomp { get; }
public Dictionary<T, int> DecompMap { get; }
public ConcreteGroup<Ep<ZnInt>> AbCanonic { get; }
private Dictionary<T, Ep<ZnInt>> ToCanonic { get; }
private Dictionary<Ep<ZnInt>, T> FromCanonic { get; }
public List<(T g, int o)> DecompElementary { get; }
public Dictionary<T, int> DecompElementaryMap { get; }
public ConcreteGroup<Ep<ZnInt>> AbElementaries { get; }
private Dictionary<T, Ep<ZnInt>> ToElementaries { get; }
private Dictionary<Ep<ZnInt>, T> FromElementaries { get; }

Dealing with generators

With basics abelians groups or direct products, computing all automorphisms or all homomorphism is possibles from canonics generetors, but it can takes very long time. Generators for abelians subgroups is more complicated, they are not canonics but it is possible.

Dealing with generators will also resolve complex cases of semidirect product. Finding generators quickly for non abelian groups, when they are isomorphic to a semidirect product, it can be probably done, may be a tiny classifier of groups by order is necessary.

Computing finitely presented group by generators and relators with bruteforce is very costly, they can be included in this project but not at this time.

The project uses implicitly many well known theorems and they can be explained in details inside the "future" documentation.

Generators allows also to compute all subgroups, and will be the possible last step to finish dealing with Groups Morphisms, then classic groups will be fast to write, to complete the first objective of this project, and staying accessible for undergraduate level.

Improving Performance by Transitioning from Symbolic to Numeric Computing

I have faced significant challenges when computing splitting fields and Galois groups of high-degree symbolic polynomials.

These calculations can be incredibly time-consuming, especially when dealing with polynomials of degree greater than 5.

One approach that I am considering is leveraging numerical techniques such as approximation and interpolation to speed up the calculations.

Let's try.

Bug S4/K4 ~ S3 which is not abelian

Runnig this code

var s4 = new Sn(4);
var S4 = Group.Generate("S4", s4[(1, 2)], s4[(1, 2, 3, 4)]);
var V = Group.Generate("V", S4, s4[(1, 2), (3, 4)], s4[(1, 3), (2, 4)]);
var Q = S4.Over(V);
DisplayGroup.HeadClassesTable(Q);

will output

|S4/V| = 6
Type        AbelianGroup
BaseGroup   S4
SuperGroup  |S4| = 24
NormalGroup |V| = 4

Cosets
(1)[1]
(2)[2]
(3)[2]
(4)[2]
(5)[3]
(6)[3]

1 2 3 4 5 6
2 1 6 5 4 3
3 5 1 6 2 4
4 6 5 1 3 2
5 3 4 2 6 1
6 4 2 3 1 5

The table and the order of classes are valid but the group is not Abelian.

KAutomorphism is an element

public readonly struct KAut<K> : IGroup<EPoly<K>> where K : struct, IElt<K>, IRingElt<K>, IFieldElt<K>

The name of this struct must be changed to KAutGroup
An element KAut must be created with strong equality comparer related to a KAutGroup by checking linear dependency with previous elements. It may be costly but it doesn't matter for small groups.

Multiple indeterminates Polynomials

GL(2,4) isnt supported because it needs $\mathbb{F}_4$ which also needs a better implementation for Galois field.
But a better implementation of Field needs a better implementation of Ring, particularly multiple indeterminates polynomials.

The project will go a little over undergraduate level to graduate level, but it will be more stable and it becomes exciting to be able to deal with group extension faster using ring and field theory.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.