{{{id=1| def power_residue_symbol(e, P, m, check=True): """ The m-th power residue symbol for an element e and proper ideal P. .. math: .. note: accepts m=1, returns 1 INPUT: - ``e`` - element of a number field - ``P`` - proper ideal of a number field or ZZ - ``m`` - positive integer OUTPUT: - an m-th root of unity in the number field of definition for P EXAMPLES: sage: power_residue_symbol(7,ZZ.ideal(11),2) -1 sage: K. = NumberField(x^2 - x + 1) sage: power_residue_symbol(w^2+3,K.ideal(17),3) -w """ Felt = parent(e) K = P.ring() if (K == ZZ and m == 2): return kronecker_symbol(e,P.gen()) if (check): if (P.is_trivial()): raise ValueError, "Ideal must be proper" if (m < 1): raise ValueError, "Power must be positive" if (K == ZZ or Set(Felt.embeddings(K)).cardinality() == 0): raise ValueError, "Element is not in the same number field as the ideal" if (not P.is_coprime(e)): raise ValueError, "Element is not coprime to the ideal" if (not P.is_coprime(m)): raise ValueError, "Ideal is not coprime to the power" roots = K.roots_of_unity() if (check): if (not len(roots)%m == 0): raise ValueError, "The residue symbol to that power is not defined for the number field" if (not P.is_prime()): return prod(power_residue_symbol(e,Q,m)^i for Q, i in P.factor()) k = P.residue_field() r = k(e) r = k(r^((1/m)*(P.norm()-1))) for j in roots: if k(j) == r: return j return 'Failure' /// }}} {{{id=2| kronecker_symbol(7,11) /// -1 }}} {{{id=3| power_residue_symbol(7,ZZ.ideal(11),2) /// -1 }}} {{{id=4| K. = NumberField(x^2 - x + 1) power_residue_symbol(w^2+4,K.ideal(11),3) /// w - 1 }}} {{{id=5| /// }}}