def list_to_factored_poly_otherorder(s, galois=False): """ Either return the polynomial in a nice factored form, or return a pair, with first entry the factored polynomial and the second entry a list describing the Galois groups of the factors. """ gal_list = [] if len(s) == 1: if galois: return [str(s[0]), [[0, 0]]] return str(s[0]) sfacts = factor(PolynomialRing(ZZ, 'T')(s)) sfacts_fc = [[v[0], v[1]] for v in sfacts] if sfacts.unit() == -1: sfacts_fc[0][0] *= -1 outstr = '' x = var('x') for v in sfacts_fc: this_poly = v[0] # if the factor is -1+T^2, replace it by 1-T^2 # this should happen an even number of times, mod powers if this_poly.substitute(T=0) == -1: this_poly = -1 * this_poly v[0] = this_poly if galois: this_degree = this_poly.degree() # hack because currently sage only handles monic polynomials: this_poly = expand(x**this_degree * this_poly.substitute(T=1 / x)) this_number_field = NumberField(this_poly, "a") this_gal = this_number_field.galois_group(type='pari') this_t_number = this_gal.group()._pari_()[2]._sage_() gal_list.append([this_degree, this_t_number]) vcf = v[0].list() started = False if len(sfacts) > 1 or v[1] > 1: outstr += '(' for i in range(len(vcf)): if vcf[i] != 0: if started and vcf[i] > 0: outstr += '+' started = True if i == 0: outstr += str(vcf[i]) else: if abs(vcf[i]) != 1: outstr += str(vcf[i]) elif vcf[i] == -1: outstr += '-' if i == 1: outstr += 'T' elif i > 1: outstr += 'T^{' + str(i) + '}' if len(sfacts) > 1 or v[1] > 1: outstr += ')' if v[1] > 1: outstr += '^{' + str(v[1]) + '}' if galois: if galois and len(sfacts_fc) == 2: if sfacts[0][0].degree() == 2 and sfacts[1][0].degree() == 2: troubletest = sfacts[0][0].disc() * sfacts[1][0].disc() if troubletest.is_square(): gal_list = [[2, 1]] return [outstr, gal_list] return outstr
def list_to_factored_poly_otherorder(s, galois=False, vari = 'T'): """ Either return the polynomial in a nice factored form, or return a pair, with first entry the factored polynomial and the second entry a list describing the Galois groups of the factors. vari allows to choose the variable of the polynomial to be returned. """ gal_list=[] if len(s) == 1: if galois: return [str(s[0]), [[0,0]]] return str(s[0]) sfacts = factor(PolynomialRing(ZZ, 'T')(s)) sfacts_fc = [[v[0],v[1]] for v in sfacts] if sfacts.unit() == -1: sfacts_fc[0][0] *= -1 outstr = '' x = var('x') for v in sfacts_fc: this_poly = v[0] # if the factor is -1+T^2, replace it by 1-T^2 # this should happen an even number of times, mod powers if this_poly.substitute(T=0) == -1: this_poly = -1*this_poly v[0] = this_poly if galois: this_degree = this_poly.degree() # hack because currently sage only handles monic polynomials: this_poly = expand(x**this_degree*this_poly.substitute(T=1/x)) this_number_field = NumberField(this_poly, "a") this_gal = this_number_field.galois_group(type='pari') this_t_number = this_gal.group().__pari__()[2].sage() gal_list.append([this_degree, this_t_number]) vcf = v[0].list() started = False if len(sfacts) > 1 or v[1] > 1: outstr += '(' for i in range(len(vcf)): if vcf[i] != 0: if started and vcf[i] > 0: outstr += '+' started = True if i == 0: outstr += str(vcf[i]) else: if abs(vcf[i]) != 1: outstr += str(vcf[i]) elif vcf[i] == -1: outstr += '-' if i == 1: outstr += vari #instead of putting in T for the variable, put in a variable of your choice elif i > 1: outstr += vari + '^{' + str(i) + '}' if len(sfacts) > 1 or v[1] > 1: outstr += ')' if v[1] > 1: outstr += '^{' + str(v[1]) + '}' if galois: if galois and len(sfacts_fc)==2: if sfacts[0][0].degree()==2 and sfacts[1][0].degree()==2: troubletest = sfacts[0][0].disc()*sfacts[1][0].disc() if troubletest.is_square(): gal_list=[[2,1]] return [outstr, gal_list] return outstr