namespace http://mathhub.info/MitM/core/algebra 

import base http://mathhub.info/MitM/Foundation 

theory Polynomials : base:?Logic =
	include ☞base:?Sequences 
	include ?Ring 
	finiteSum : {r:ring, n} (r.universe)^n ⟶ (r.universe)  = [r,n,s] foldL (r.rplus) (r.rzero) n s   #  3 
	power_seq : {r:ring, n : NAT} r.universe ⟶ r.universe  = [r,n,x] foldL (r.rtimes) (r.rone) n ⟨' x | i:n '⟩  # 3 tothe 2 
	polynomial_of : {r : ring, n} (r.universe)^n ⟶ (r.universe) ⟶ (r.universe)  = [r,n,s] [x] ∑ ⟨' ((r.rtimes) (s..i) (x tothe i) ) | i:n '⟩
		 # polynomial_of 3  
	
	OneDimensionalPolynomialsOver : ring ⟶ type = [r] ⟨ f : (r.universe) ⟶ (r.universe) | ⊦ ∃ [n] exists_seq (r.universe) n [s] f ≐ (polynomial_of s)  ⟩ 
	
	polynomialRing : ring ⟶ ring  // TODO 
	
	polynomial : ring ⟶ type  = [r] (polynomialRing r).universe 
	
	multi_polynomial : ring ⟶ type 
	monomial : {r : ring} type  # monomial 1


theory NumberSpaces : base:?Logic =
	include ?RationalField 
	include ?Polynomials 
	
	numberField : (polynomialRing rationalField).universe ⟶ ring 
	galoisGroup : ring ⟶ group 


theory RationalPolynomials : base:?Logic =
	include ?Polynomials 
	include ☞base:?Lists 
	include algebra?RationalField 
	include ☞base:?ProductTypes 
	
	poly_con : {r : ring} string ⟶ List ℚ ⟶ polynomial r  // = [n,s] polynomial_of s 
	
	monomial_con : {r: ring} (List (string × ℕ)) × ℚ ⟶ monomial r  # monomial_con 1 2
	multi_poly_con : {r : ring} List (monomial r) ⟶ multi_polynomial r  # mpoly 2 
	
	// x1 =  "x1" ❙
	// x2 = "x2" ❙
	// test1 = ⟨ x1 , 1 ⟩ ❙
	// m1 = monomial_con rationalField2 ⟨  (⟨ x1 , 1 ⟩ ++ nil) , 3 ⟩ ❙
	// m2 = monomial_con rationalField2 ⟨ (⟨ x2, 1⟩ ++ nil),2⟩ ❙
	// p = mpoly (ls m1,m2) ❙
	
	groebner : {r : ring} List (multi_polynomial r) ⟶ List (multi_polynomial r)  # groebner 2