Ternary quadratic form with integer coefficients¶
AUTHOR:
Gustavo Rama
Based in code of Gonzalo Tornaria
The form \(a\cdot x^2 + b\cdot y^2 + c\cdot z^2 + r\cdot yz + s\cdot xz + t\cdot xy\) is stored as a tuple (a, b, c, r, s, t)
of integers.
- class sage.quadratic_forms.ternary_qf.TernaryQF(v)[source]¶
Bases:
SageObject
The
TernaryQF
class represents a quadratic form in 3 variables with coefficients in \(\ZZ\).INPUT:
v
– list or tuple of 6 entries:[a,b,c,r,s,t]
OUTPUT: the ternary quadratic form \(a\cdot x^2 + b\cdot y^2 + c\cdot z^2 + r\cdot y\cdot z + s\cdot x\cdot z + t\cdot x\cdot y\)
EXAMPLES:
sage: Q = TernaryQF([1, 2, 3, 4, 5, 6]); Q Ternary quadratic form with integer coefficients: [1 2 3] [4 5 6] sage: A = matrix(ZZ, 3, [1, -7, 1, 0, -2, 1, 0, -1, 0]) sage: Q(A) Ternary quadratic form with integer coefficients: [1 187 9] [-85 8 -31] sage: TestSuite(TernaryQF).run()
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6)]); Q Ternary quadratic form with integer coefficients: [1 2 3] [4 5 6] >>> A = matrix(ZZ, Integer(3), [Integer(1), -Integer(7), Integer(1), Integer(0), -Integer(2), Integer(1), Integer(0), -Integer(1), Integer(0)]) >>> Q(A) Ternary quadratic form with integer coefficients: [1 187 9] [-85 8 -31] >>> TestSuite(TernaryQF).run()
- adjoint()[source]¶
Return the adjoint form associated to the given ternary quadratic form.
That is, the Hessian matrix of the adjoint form is twice the classical adjoint matrix of the Hessian matrix of the given form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 17, 0, 0, 1]) sage: Q.adjoint() Ternary quadratic form with integer coefficients: [68 68 3] [0 0 -68] sage: Q.adjoint().matrix() == 2*Q.matrix().adjoint_classical() True
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(17), Integer(0), Integer(0), Integer(1)]) >>> Q.adjoint() Ternary quadratic form with integer coefficients: [68 68 3] [0 0 -68] >>> Q.adjoint().matrix() == Integer(2)*Q.matrix().adjoint_classical() True
- automorphism_spin_norm(A)[source]¶
Return the spin norm of the automorphism \(A\).
EXAMPLES:
sage: Q = TernaryQF([9, 12, 30, -26, -28, 20]) sage: A = matrix(ZZ, 3, [9, 10, -10, -6, -7, 6, 2, 2, -3]) sage: A.det() 1 sage: Q(A) == Q True sage: Q.automorphism_spin_norm(A) 7
>>> from sage.all import * >>> Q = TernaryQF([Integer(9), Integer(12), Integer(30), -Integer(26), -Integer(28), Integer(20)]) >>> A = matrix(ZZ, Integer(3), [Integer(9), Integer(10), -Integer(10), -Integer(6), -Integer(7), Integer(6), Integer(2), Integer(2), -Integer(3)]) >>> A.det() 1 >>> Q(A) == Q True >>> Q.automorphism_spin_norm(A) 7
- automorphism_symmetries(A)[source]¶
Given the automorphism \(A\), if \(A\) is the identity, return the empty list. Otherwise, return a list of two vectors \(v_1\), \(v_2\) such that the product of the symmetries of the ternary quadratic form given by the two vectors is \(A\).
EXAMPLES:
sage: Q = TernaryQF([9, 12, 30, -26, -28, 20]) sage: A = matrix(ZZ, 3, [9, 10, -10, -6, -7, 6, 2, 2, -3]) sage: Q(A) == Q True sage: v1, v2 = Q.automorphism_symmetries(A) sage: v1, v2 ((8, -6, 2), (1, -5/4, -1/4)) sage: A1 = Q.symmetry(v1) sage: A1 [ 9 9 -13] [ -6 -23/4 39/4] [ 2 9/4 -9/4] sage: A2 = Q.symmetry(v2) sage: A2 [ 1 1 3] [ 0 -1/4 -15/4] [ 0 -1/4 1/4] sage: A1*A2 == A True sage: Q.automorphism_symmetries(identity_matrix(ZZ,3)) []
>>> from sage.all import * >>> Q = TernaryQF([Integer(9), Integer(12), Integer(30), -Integer(26), -Integer(28), Integer(20)]) >>> A = matrix(ZZ, Integer(3), [Integer(9), Integer(10), -Integer(10), -Integer(6), -Integer(7), Integer(6), Integer(2), Integer(2), -Integer(3)]) >>> Q(A) == Q True >>> v1, v2 = Q.automorphism_symmetries(A) >>> v1, v2 ((8, -6, 2), (1, -5/4, -1/4)) >>> A1 = Q.symmetry(v1) >>> A1 [ 9 9 -13] [ -6 -23/4 39/4] [ 2 9/4 -9/4] >>> A2 = Q.symmetry(v2) >>> A2 [ 1 1 3] [ 0 -1/4 -15/4] [ 0 -1/4 1/4] >>> A1*A2 == A True >>> Q.automorphism_symmetries(identity_matrix(ZZ,Integer(3))) []
- automorphisms(slow=True)[source]¶
Return a list with the automorphisms of the definite ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 7, 0, 0, 0]) sage: auts = Q.automorphisms(); auts [ [-1 0 0] [-1 0 0] [ 0 -1 0] [ 0 -1 0] [ 0 1 0] [ 0 1 0] [ 0 -1 0] [ 0 1 0] [-1 0 0] [ 1 0 0] [-1 0 0] [ 1 0 0] [ 0 0 1], [ 0 0 -1], [ 0 0 -1], [ 0 0 1], [ 0 0 1], [ 0 0 -1], [ 1 0 0] [1 0 0] [ 0 -1 0] [0 1 0] [ 0 0 -1], [0 0 1] ] sage: all(Q == Q(A) for A in auts) True sage: Q = TernaryQF([3, 4, 5, 3, 3, 2]) sage: Q.automorphisms(slow=False) [ [1 0 0] [0 1 0] [0 0 1] ] sage: Q = TernaryQF([4, 2, 4, 3, -4, -5]) sage: auts = Q.automorphisms(slow=False) sage: auts [ [1 0 0] [ 2 -1 -1] [0 1 0] [ 3 -2 -1] [0 0 1], [ 0 0 -1] ] sage: A = auts[1] sage: Q(A) == Q True sage: Qr, M_red = Q.reduced_form_eisenstein() sage: Qr Ternary quadratic form with integer coefficients: [1 2 3] [-1 0 -1] sage: Q(A*M_red) == Qr True
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(7), Integer(0), Integer(0), Integer(0)]) >>> auts = Q.automorphisms(); auts [ [-1 0 0] [-1 0 0] [ 0 -1 0] [ 0 -1 0] [ 0 1 0] [ 0 1 0] [ 0 -1 0] [ 0 1 0] [-1 0 0] [ 1 0 0] [-1 0 0] [ 1 0 0] [ 0 0 1], [ 0 0 -1], [ 0 0 -1], [ 0 0 1], [ 0 0 1], [ 0 0 -1], [ 1 0 0] [1 0 0] [ 0 -1 0] [0 1 0] [ 0 0 -1], [0 0 1] ] >>> all(Q == Q(A) for A in auts) True >>> Q = TernaryQF([Integer(3), Integer(4), Integer(5), Integer(3), Integer(3), Integer(2)]) >>> Q.automorphisms(slow=False) [ [1 0 0] [0 1 0] [0 0 1] ] >>> Q = TernaryQF([Integer(4), Integer(2), Integer(4), Integer(3), -Integer(4), -Integer(5)]) >>> auts = Q.automorphisms(slow=False) >>> auts [ [1 0 0] [ 2 -1 -1] [0 1 0] [ 3 -2 -1] [0 0 1], [ 0 0 -1] ] >>> A = auts[Integer(1)] >>> Q(A) == Q True >>> Qr, M_red = Q.reduced_form_eisenstein() >>> Qr Ternary quadratic form with integer coefficients: [1 2 3] [-1 0 -1] >>> Q(A*M_red) == Qr True
- basic_lemma(p)[source]¶
Find a number represented by
self
and coprime to the prime \(p\).EXAMPLES:
sage: Q = TernaryQF([3, 3, 3, -2, 0, -1]) sage: Q.basic_lemma(3) 4
>>> from sage.all import * >>> Q = TernaryQF([Integer(3), Integer(3), Integer(3), -Integer(2), Integer(0), -Integer(1)]) >>> Q.basic_lemma(Integer(3)) 4
- coefficient(n)[source]¶
Return the \(n\)-th coefficient of the ternary quadratic form.
INPUT:
n
– integer with \(0 \leq n \leq 5\)
EXAMPLES:
sage: Q = TernaryQF([1, 2, 3, 4, 5, 6]); Q Ternary quadratic form with integer coefficients: [1 2 3] [4 5 6] sage: Q.coefficient(2) 3 sage: Q.coefficient(5) 6
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6)]); Q Ternary quadratic form with integer coefficients: [1 2 3] [4 5 6] >>> Q.coefficient(Integer(2)) 3 >>> Q.coefficient(Integer(5)) 6
- coefficients()[source]¶
Return the list of coefficients of the ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([1, 2, 3, 4, 5, 6]); Q Ternary quadratic form with integer coefficients: [1 2 3] [4 5 6] sage: Q.coefficients() (1, 2, 3, 4, 5, 6)
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6)]); Q Ternary quadratic form with integer coefficients: [1 2 3] [4 5 6] >>> Q.coefficients() (1, 2, 3, 4, 5, 6)
- content()[source]¶
Return the greatest common divisor of the coefficients of the given ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 2, 0, 0, 0]) sage: Q.content() 1 sage: Q = TernaryQF([2, 4, 6, 0, 0, 0]) sage: Q.content() 2 sage: Q.scale_by_factor(100).content() 200
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(2), Integer(0), Integer(0), Integer(0)]) >>> Q.content() 1 >>> Q = TernaryQF([Integer(2), Integer(4), Integer(6), Integer(0), Integer(0), Integer(0)]) >>> Q.content() 2 >>> Q.scale_by_factor(Integer(100)).content() 200
- delta()[source]¶
Return the omega of the adjoint of the given ternary quadratic form, which is the same as the omega of the reciprocal form.
EXAMPLES:
sage: Q = TernaryQF([1, 2, 2, -1, 0, -1]) sage: Q.delta() 208 sage: Q.adjoint().omega() 208 sage: Q = TernaryQF([1, -1, 1, 0, 0, 0]) sage: Q.delta() 4 sage: Q.omega() 4
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(2), Integer(2), -Integer(1), Integer(0), -Integer(1)]) >>> Q.delta() 208 >>> Q.adjoint().omega() 208 >>> Q = TernaryQF([Integer(1), -Integer(1), Integer(1), Integer(0), Integer(0), Integer(0)]) >>> Q.delta() 4 >>> Q.omega() 4
- disc()[source]¶
Return the discriminant of the ternary quadratic form, this is the determinant of the matrix divided by 2.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 2, 0, -1, 4]) sage: Q.disc() -25 sage: Q.matrix().det() -50
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(2), Integer(0), -Integer(1), Integer(4)]) >>> Q.disc() -25 >>> Q.matrix().det() -50
- divisor()[source]¶
Return the content of the adjoint form associated to the given form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 17, 0, 0, 0]) sage: Q.divisor() 4
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(17), Integer(0), Integer(0), Integer(0)]) >>> Q.divisor() 4
- find_p_neighbor_from_vec(p, v, mat=False)[source]¶
Finds the reduced equivalent of the \(p\)-neighbor of this ternary quadratic form associated to a given vector \(v\) satisfying:
\(Q(v) = 0\) (mod \(p\))
\(v\) is a non-singular point of the conic \(Q(v) = 0\) (mod \(p\)).
REFERENCES:
Gonzalo Tornaria’s Thesis, Thrm 3.5, p34.
EXAMPLES:
sage: # needs sage.libs.pari sage: Q = TernaryQF([1, 3, 3, -2, 0, -1]); Q Ternary quadratic form with integer coefficients: [1 3 3] [-2 0 -1] sage: Q.disc() 29 sage: v = (9, 7, 1) sage: v in Q.find_zeros_mod_p(11) True sage: Q11, M = Q.find_p_neighbor_from_vec(11, v, mat=True) sage: Q11 Ternary quadratic form with integer coefficients: [1 2 4] [-1 -1 0] sage: M [ -1 -5/11 7/11] [ 0 -10/11 3/11] [ 0 -3/11 13/11] sage: Q(M) == Q11 True
>>> from sage.all import * >>> # needs sage.libs.pari >>> Q = TernaryQF([Integer(1), Integer(3), Integer(3), -Integer(2), Integer(0), -Integer(1)]); Q Ternary quadratic form with integer coefficients: [1 3 3] [-2 0 -1] >>> Q.disc() 29 >>> v = (Integer(9), Integer(7), Integer(1)) >>> v in Q.find_zeros_mod_p(Integer(11)) True >>> Q11, M = Q.find_p_neighbor_from_vec(Integer(11), v, mat=True) >>> Q11 Ternary quadratic form with integer coefficients: [1 2 4] [-1 -1 0] >>> M [ -1 -5/11 7/11] [ 0 -10/11 3/11] [ 0 -3/11 13/11] >>> Q(M) == Q11 True
Test that it works with (0, 0, 1):
sage: Q.find_p_neighbor_from_vec(3, (0,0,1)) # needs sage.libs.pari Ternary quadratic form with integer coefficients: [1 3 3] [-2 0 -1]
>>> from sage.all import * >>> Q.find_p_neighbor_from_vec(Integer(3), (Integer(0),Integer(0),Integer(1))) # needs sage.libs.pari Ternary quadratic form with integer coefficients: [1 3 3] [-2 0 -1]
- find_p_neighbors(p, mat=False)[source]¶
Find a list with all the reduced equivalent of the \(p\)-neighbors of this ternary quadratic form, given by the zeros mod \(p\) of the form. See
find_p_neighbor_from_vec()
for more information.EXAMPLES:
sage: # needs sage.libs.pari sage: Q0 = TernaryQF([1, 3, 3, -2, 0, -1]); Q0 Ternary quadratic form with integer coefficients: [1 3 3] [-2 0 -1] sage: neig = Q0.find_p_neighbors(5) sage: len(neig) 6 sage: Q1 = TernaryQF([1, 1, 10, 1, 1, 1]) sage: Q2 = TernaryQF([1, 2, 4, -1, -1, 0]) sage: neig.count(Q0) 2 sage: neig.count(Q1) 1 sage: neig.count(Q2) 3
>>> from sage.all import * >>> # needs sage.libs.pari >>> Q0 = TernaryQF([Integer(1), Integer(3), Integer(3), -Integer(2), Integer(0), -Integer(1)]); Q0 Ternary quadratic form with integer coefficients: [1 3 3] [-2 0 -1] >>> neig = Q0.find_p_neighbors(Integer(5)) >>> len(neig) 6 >>> Q1 = TernaryQF([Integer(1), Integer(1), Integer(10), Integer(1), Integer(1), Integer(1)]) >>> Q2 = TernaryQF([Integer(1), Integer(2), Integer(4), -Integer(1), -Integer(1), Integer(0)]) >>> neig.count(Q0) 2 >>> neig.count(Q1) 1 >>> neig.count(Q2) 3
- find_zeros_mod_p(p)[source]¶
Find the zeros of the given ternary quadratic positive definite form modulo a prime \(p\), where \(p\) doesn’t divide the discriminant of the form.
EXAMPLES:
sage: Q = TernaryQF([4, 7, 8, -4, -1, -3]) sage: Q.is_positive_definite() True sage: Q.disc().factor() 3 * 13 * 19 sage: Q.find_zeros_mod_p(2) [(1, 0, 0), (1, 1, 0), (0, 0, 1)] sage: zeros_17 = Q.find_zeros_mod_p(17) # needs sage.libs.pari sage: len(zeros_17) # needs sage.libs.pari 18 sage: [Q(v)%17 for v in zeros_17] # needs sage.libs.pari [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> from sage.all import * >>> Q = TernaryQF([Integer(4), Integer(7), Integer(8), -Integer(4), -Integer(1), -Integer(3)]) >>> Q.is_positive_definite() True >>> Q.disc().factor() 3 * 13 * 19 >>> Q.find_zeros_mod_p(Integer(2)) [(1, 0, 0), (1, 1, 0), (0, 0, 1)] >>> zeros_17 = Q.find_zeros_mod_p(Integer(17)) # needs sage.libs.pari >>> len(zeros_17) # needs sage.libs.pari 18 >>> [Q(v)%Integer(17) for v in zeros_17] # needs sage.libs.pari [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- is_definite()[source]¶
Determine if the ternary quadratic form is definite.
EXAMPLES:
sage: Q = TernaryQF([10, 10, 1, -1, 2, 3]) sage: Q.is_definite() True sage: (-Q).is_definite() True sage: Q = TernaryQF([1, 1, 2, -3, 0, -1]) sage: Q.is_definite() False
>>> from sage.all import * >>> Q = TernaryQF([Integer(10), Integer(10), Integer(1), -Integer(1), Integer(2), Integer(3)]) >>> Q.is_definite() True >>> (-Q).is_definite() True >>> Q = TernaryQF([Integer(1), Integer(1), Integer(2), -Integer(3), Integer(0), -Integer(1)]) >>> Q.is_definite() False
- is_eisenstein_reduced()[source]¶
Determine if the ternary quadratic form is Eisenstein reduced.
That is, if we have a ternary quadratic form:
[a b c] [r s t]
then
\(a \leq b \leq c\);
\(r\), \(s\), and \(t\) are all positive or all nonpositive;
\(a \geq |t|\); \(a \geq |s|\); \(b \geq |r|\);
\(a+b+r+s+t \geq 0\);
\(a=t\) implies \(s \leq 2\cdot r\); \(a=s\) implies \(t \leq 2\cdot r\); \(b=r\) implies \(t \leq 2\cdot s\);
\(a=-t\) implies \(s=0\); \(a=-s\) implies \(t=0\); \(b=-r\) implies \(t=0\);
\(a+b+r+s+t = 0\) implies \(2\cdot a+2\cdot s+t \leq 0\);
\(a=b\) implies \(|r| \leq |s|\); \(b=c\) implies \(|s| \leq |t|\).
EXAMPLES:
sage: Q = TernaryQF([1, 1, 1, 0, 0, 0]) sage: Q.is_eisenstein_reduced() True sage: Q = TernaryQF([34, 14, 44, 12, 25, -22]) sage: Q.is_eisenstein_reduced() False
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(1), Integer(0), Integer(0), Integer(0)]) >>> Q.is_eisenstein_reduced() True >>> Q = TernaryQF([Integer(34), Integer(14), Integer(44), Integer(12), Integer(25), -Integer(22)]) >>> Q.is_eisenstein_reduced() False
- is_negative_definite()[source]¶
Determine if the ternary quadratic form is negative definite.
EXAMPLES:
sage: Q = TernaryQF([-8, -9, -10, 1, 9, -3]) sage: Q.is_negative_definite() True sage: Q = TernaryQF([-4, -1, 6, -5, 1, -5]) sage: Q((0, 0, 1)) 6 sage: Q.is_negative_definite() False
>>> from sage.all import * >>> Q = TernaryQF([-Integer(8), -Integer(9), -Integer(10), Integer(1), Integer(9), -Integer(3)]) >>> Q.is_negative_definite() True >>> Q = TernaryQF([-Integer(4), -Integer(1), Integer(6), -Integer(5), Integer(1), -Integer(5)]) >>> Q((Integer(0), Integer(0), Integer(1))) 6 >>> Q.is_negative_definite() False
- is_positive_definite()[source]¶
Determine if the ternary quadratic form is positive definite.
EXAMPLES:
sage: Q = TernaryQF([10, 10, 1, -1, 2, 3]) sage: Q.is_positive_definite() True sage: (-Q).is_positive_definite() False sage: Q = TernaryQF([1, 1, 0, 0, 0, 0]) sage: Q.is_positive_definite() False sage: Q = TernaryQF([1, 1, 1, -1, -2, -3]) sage: Q((1,1,1)) -3 sage: Q.is_positive_definite() False
>>> from sage.all import * >>> Q = TernaryQF([Integer(10), Integer(10), Integer(1), -Integer(1), Integer(2), Integer(3)]) >>> Q.is_positive_definite() True >>> (-Q).is_positive_definite() False >>> Q = TernaryQF([Integer(1), Integer(1), Integer(0), Integer(0), Integer(0), Integer(0)]) >>> Q.is_positive_definite() False >>> Q = TernaryQF([Integer(1), Integer(1), Integer(1), -Integer(1), -Integer(2), -Integer(3)]) >>> Q((Integer(1),Integer(1),Integer(1))) -3 >>> Q.is_positive_definite() False
- is_primitive()[source]¶
Determine if the ternary quadratic form is primitive.
This means that the greatest common divisor of the coefficients of the form is 1.
EXAMPLES:
sage: Q = TernaryQF([1, 2, 3, 4, 5, 6]) sage: Q.is_primitive() True sage: Q.content() 1 sage: Q = TernaryQF([10, 10, 10, 5, 5, 5]) sage: Q.content() 5 sage: Q.is_primitive() False
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(2), Integer(3), Integer(4), Integer(5), Integer(6)]) >>> Q.is_primitive() True >>> Q.content() 1 >>> Q = TernaryQF([Integer(10), Integer(10), Integer(10), Integer(5), Integer(5), Integer(5)]) >>> Q.content() 5 >>> Q.is_primitive() False
- level()[source]¶
Return the level of the ternary quadratic form, which is 4 times the discriminant divided by the divisor.
EXAMPLES:
sage: Q = TernaryQF([1, 2, 2, -1, 0, -1]) sage: Q.level() 52 sage: 4*Q.disc()/Q.divisor() 52
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(2), Integer(2), -Integer(1), Integer(0), -Integer(1)]) >>> Q.level() 52 >>> Integer(4)*Q.disc()/Q.divisor() 52
- matrix()[source]¶
Return the Hessian matrix associated to the ternary quadratic form. That is, if \(Q\) is a ternary quadratic form, \(Q(x,y,z) = a\cdot x^2 + b\cdot y^2 + c\cdot z^2 + r\cdot y\cdot z + s\cdot x\cdot z + t\cdot x\cdot y\), then the Hessian matrix associated to \(Q\) is
[2\cdot a t s] [t 2\cdot b r] [s r 2\cdot c]
EXAMPLES:
sage: Q = TernaryQF([1,1,2,0,-1,4]); Q Ternary quadratic form with integer coefficients: [1 1 2] [0 -1 4] sage: M = Q.matrix(); M [ 2 4 -1] [ 4 2 0] [-1 0 4] sage: v = vector((1, 2, 3)) sage: Q(v) 28 sage: (v*M*v.column())[0]//2 28
>>> from sage.all import * >>> Q = TernaryQF([Integer(1),Integer(1),Integer(2),Integer(0),-Integer(1),Integer(4)]); Q Ternary quadratic form with integer coefficients: [1 1 2] [0 -1 4] >>> M = Q.matrix(); M [ 2 4 -1] [ 4 2 0] [-1 0 4] >>> v = vector((Integer(1), Integer(2), Integer(3))) >>> Q(v) 28 >>> (v*M*v.column())[Integer(0)]//Integer(2) 28
- number_of_automorphisms(slow=True)[source]¶
Return the number of automorphisms of the definite ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 7, 0, 0, 0]) sage: A = matrix(ZZ, 3, [0, 1, 0, -1, 5, 0, -8, -1, 1]) sage: A.det() 1 sage: Q1 = Q(A); Q1 Ternary quadratic form with integer coefficients: [449 33 7] [-14 -112 102] sage: Q1.number_of_automorphisms() 8 sage: Q = TernaryQF([-19, -7, -6, -12, 20, 23]) sage: Q.is_negative_definite() True sage: Q.number_of_automorphisms(slow=False) 24
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(7), Integer(0), Integer(0), Integer(0)]) >>> A = matrix(ZZ, Integer(3), [Integer(0), Integer(1), Integer(0), -Integer(1), Integer(5), Integer(0), -Integer(8), -Integer(1), Integer(1)]) >>> A.det() 1 >>> Q1 = Q(A); Q1 Ternary quadratic form with integer coefficients: [449 33 7] [-14 -112 102] >>> Q1.number_of_automorphisms() 8 >>> Q = TernaryQF([-Integer(19), -Integer(7), -Integer(6), -Integer(12), Integer(20), Integer(23)]) >>> Q.is_negative_definite() True >>> Q.number_of_automorphisms(slow=False) 24
- omega()[source]¶
Return the content of the adjoint of the primitive associated ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([4, 11, 12, 0, -4, 0]) sage: Q.omega() 176 sage: Q.primitive().adjoint().content() 176
>>> from sage.all import * >>> Q = TernaryQF([Integer(4), Integer(11), Integer(12), Integer(0), -Integer(4), Integer(0)]) >>> Q.omega() 176 >>> Q.primitive().adjoint().content() 176
- polynomial(names='x,y,z')[source]¶
Return the polynomial associated to the ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 0, 2, -3, -1]); Q Ternary quadratic form with integer coefficients: [1 1 0] [2 -3 -1] sage: p = Q.polynomial(); p x^2 - x*y + y^2 - 3*x*z + 2*y*z sage: p.parent() Multivariate Polynomial Ring in x, y, z over Integer Ring
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(0), Integer(2), -Integer(3), -Integer(1)]); Q Ternary quadratic form with integer coefficients: [1 1 0] [2 -3 -1] >>> p = Q.polynomial(); p x^2 - x*y + y^2 - 3*x*z + 2*y*z >>> p.parent() Multivariate Polynomial Ring in x, y, z over Integer Ring
- possible_automorphisms = None¶
- primitive()[source]¶
Return the primitive version of the ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([2, 2, 2, 1, 1, 1]) sage: Q.is_primitive() True sage: Q.primitive() Ternary quadratic form with integer coefficients: [2 2 2] [1 1 1] sage: Q.primitive() == Q True sage: Q = TernaryQF([10, 10, 10, 5, 5, 5]) sage: Q.primitive() Ternary quadratic form with integer coefficients: [2 2 2] [1 1 1]
>>> from sage.all import * >>> Q = TernaryQF([Integer(2), Integer(2), Integer(2), Integer(1), Integer(1), Integer(1)]) >>> Q.is_primitive() True >>> Q.primitive() Ternary quadratic form with integer coefficients: [2 2 2] [1 1 1] >>> Q.primitive() == Q True >>> Q = TernaryQF([Integer(10), Integer(10), Integer(10), Integer(5), Integer(5), Integer(5)]) >>> Q.primitive() Ternary quadratic form with integer coefficients: [2 2 2] [1 1 1]
- pseudorandom_primitive_zero_mod_p(p)[source]¶
Return a tuple of the form \(v = (a, b, 1)\) such that is a zero of the given ternary quadratic positive definite form modulo an odd prime \(p\), where \(p\) doesn’t divides the discriminant of the form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 11, 0, -1, 0]) sage: Q.disc() 43 sage: Q.pseudorandom_primitive_zero_mod_p(3) # random (1, 2, 1) sage: Q((1, 2, 1)) 15 sage: v = Q.pseudorandom_primitive_zero_mod_p(1009) # needs sage.libs.pari sage: Q(v) % 1009 # needs sage.libs.pari 0 sage: v[2] # needs sage.libs.pari 1
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(11), Integer(0), -Integer(1), Integer(0)]) >>> Q.disc() 43 >>> Q.pseudorandom_primitive_zero_mod_p(Integer(3)) # random (1, 2, 1) >>> Q((Integer(1), Integer(2), Integer(1))) 15 >>> v = Q.pseudorandom_primitive_zero_mod_p(Integer(1009)) # needs sage.libs.pari >>> Q(v) % Integer(1009) # needs sage.libs.pari 0 >>> v[Integer(2)] # needs sage.libs.pari 1
- quadratic_form()[source]¶
Return a
QuadraticForm
with the same coefficients asself
over \(\ZZ\).EXAMPLES:
sage: Q = TernaryQF([1, 2, 3, 1, 1, 1]) sage: QF1 = Q.quadratic_form(); QF1 Quadratic form in 3 variables over Integer Ring with coefficients: [ 1 1 1 ] [ * 2 1 ] [ * * 3 ] sage: QF2 = QuadraticForm(ZZ, 3, [1, 1, 1, 2, 1, 3]) sage: bool(QF1 == QF2) True
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(2), Integer(3), Integer(1), Integer(1), Integer(1)]) >>> QF1 = Q.quadratic_form(); QF1 Quadratic form in 3 variables over Integer Ring with coefficients: [ 1 1 1 ] [ * 2 1 ] [ * * 3 ] >>> QF2 = QuadraticForm(ZZ, Integer(3), [Integer(1), Integer(1), Integer(1), Integer(2), Integer(1), Integer(3)]) >>> bool(QF1 == QF2) True
- reciprocal()[source]¶
Return the reciprocal quadratic form associated to the given form.
This is defined as the multiple of the primitive adjoint with the same content as the given form.
EXAMPLES:
sage: Q = TernaryQF([2, 2, 14, 0, 0, 0]) sage: Q.reciprocal() Ternary quadratic form with integer coefficients: [14 14 2] [0 0 0] sage: Q.content() 2 sage: Q.reciprocal().content() 2 sage: Q.adjoint().content() 16
>>> from sage.all import * >>> Q = TernaryQF([Integer(2), Integer(2), Integer(14), Integer(0), Integer(0), Integer(0)]) >>> Q.reciprocal() Ternary quadratic form with integer coefficients: [14 14 2] [0 0 0] >>> Q.content() 2 >>> Q.reciprocal().content() 2 >>> Q.adjoint().content() 16
- reciprocal_reduced()[source]¶
Return the reduced form of the reciprocal form of the given ternary quadratic form.
EXAMPLES:
sage: Q = TernaryQF([1, 1, 3, 0, -1, 0]) sage: Qrr = Q.reciprocal_reduced(); Qrr Ternary quadratic form with integer coefficients: [4 11 12] [0 -4 0] sage: Q.is_eisenstein_reduced() True sage: Qr = Q.reciprocal() sage: Qr.reduced_form_eisenstein(matrix=False) == Qrr True
>>> from sage.all import * >>> Q = TernaryQF([Integer(1), Integer(1), Integer(3), Integer(0), -Integer(1), Integer(0)]) >>> Qrr = Q.reciprocal_reduced(); Qrr Ternary quadratic form with integer coefficients: [4 11 12] [0 -4 0] >>> Q.is_eisenstein_reduced() True >>> Qr = Q.reciprocal() >>> Qr.reduced_form_eisenstein(matrix=False) == Qrr True
- reduced_form_eisenstein(matrix=True)[source]¶
Return the Eisenstein reduced form equivalent to the given positive ternary quadratic form, which is unique.
EXAMPLES:
sage: Q = TernaryQF([293, 315, 756, 908, 929, 522]) sage: Qr, m = Q.reduced_form_eisenstein() sage: Qr Ternary quadratic form with integer coefficients: [1 2 2] [-1 0 -1] sage: Qr.is_eisenstein_reduced() True sage: m [ -54 137 -38] [ -23 58 -16] [ 47 -119 33] sage: m.det() 1 sage: Q(m) == Qr True sage: Q = TernaryQF([12,36,3,14,-7,-19]) sage: Q.reduced_form_eisenstein(matrix = False) Ternary quadratic form with integer coefficients: [3 8 20] [3 2 1]
>>> from sage.all import * >>> Q = TernaryQF([Integer(293), Integer(315), Integer(756), Integer(908), Integer(929), Integer(522)]) >>> Qr, m = Q.reduced_form_eisenstein() >>> Qr Ternary quadratic form with integer coefficients: [1 2 2] [-1 0 -1] >>> Qr.is_eisenstein_reduced() True >>> m [ -54 137 -38] [ -23 58 -16] [ 47 -119 33] >>> m.det() 1 >>> Q(m) == Qr True >>> Q = TernaryQF([Integer(12),Integer(36),Integer(3),Integer(14),-Integer(7),-Integer(19)]) >>> Q.reduced_form_eisenstein(matrix = False) Ternary quadratic form with integer coefficients: [3 8 20] [3 2 1]
- scale_by_factor(k)[source]¶
Scale the values of the ternary quadratic form by the number
k
.OUTPUT:
If
k
times the content of the ternary quadratic form is an integer, return a ternary quadratic form; otherwise, return a quadratic form of dimension 3.EXAMPLES:
sage: Q = TernaryQF([2, 2, 4, 0, -2, 8]) sage: Q Ternary quadratic form with integer coefficients: [2 2 4] [0 -2 8] sage: Q.scale_by_factor(5) Ternary quadratic form with integer coefficients: [10 10 20] [0 -10 40] sage: Q.scale_by_factor(1/2) Ternary quadratic form with integer coefficients: [1 1 2] [0 -1 4] sage: Q.scale_by_factor(1/3) Quadratic form in 3 variables over Rational Field with coefficients: [ 2/3 8/3 -2/3 ] [ * 2/3 0 ] [ * * 4/3 ]
>>> from sage.all import * >>> Q = TernaryQF([Integer(2), Integer(2), Integer(4), Integer(0), -Integer(2), Integer(8)]) >>> Q Ternary quadratic form with integer coefficients: [2 2 4] [0 -2 8] >>> Q.scale_by_factor(Integer(5)) Ternary quadratic form with integer coefficients: [10 10 20] [0 -10 40] >>> Q.scale_by_factor(Integer(1)/Integer(2)) Ternary quadratic form with integer coefficients: [1 1 2] [0 -1 4] >>> Q.scale_by_factor(Integer(1)/Integer(3)) Quadratic form in 3 variables over Rational Field with coefficients: [ 2/3 8/3 -2/3 ] [ * 2/3 0 ] [ * * 4/3 ]
- symmetry(v)[source]¶
Return \(A\), the automorphism of the ternary quadratic form such that:
\(Av = -v\),
\(Au = 0\), if \(u\) is orthogonal to \(v\),
where \(v\) is a given vector.
EXAMPLES:
sage: Q = TernaryQF([4, 5, 8, 5, 2, 2]) sage: v = vector((1,1,1)) sage: M = Q.symmetry(v) sage: M [ 7/13 -17/26 -23/26] [ -6/13 9/26 -23/26] [ -6/13 -17/26 3/26] sage: M.det() -1 sage: M*v (-1, -1, -1) sage: v1 = vector((23, 0, -12)) sage: v2 = vector((0, 23, -17)) sage: v1*Q.matrix()*v 0 sage: v2*Q.matrix()*v 0 sage: M*v1 == v1 True sage: M*v2 == v2 True
>>> from sage.all import * >>> Q = TernaryQF([Integer(4), Integer(5), Integer(8), Integer(5), Integer(2), Integer(2)]) >>> v = vector((Integer(1),Integer(1),Integer(1))) >>> M = Q.symmetry(v) >>> M [ 7/13 -17/26 -23/26] [ -6/13 9/26 -23/26] [ -6/13 -17/26 3/26] >>> M.det() -1 >>> M*v (-1, -1, -1) >>> v1 = vector((Integer(23), Integer(0), -Integer(12))) >>> v2 = vector((Integer(0), Integer(23), -Integer(17))) >>> v1*Q.matrix()*v 0 >>> v2*Q.matrix()*v 0 >>> M*v1 == v1 True >>> M*v2 == v2 True
- xi(p)[source]¶
Return the value of the genus characters Xi_p… which may be missing one character. We allow \(-1\) as a prime.
REFERENCES:
Dickson’s “Studies in the Theory of Numbers”
EXAMPLES:
sage: Q1 = TernaryQF([26, 42, 53, -36, -17, -3]) sage: Q2 = Q1.find_p_neighbors(2)[1] sage: Q1.omega() 3 sage: Q1.xi(3), Q2.xi(3) (-1, -1)
>>> from sage.all import * >>> Q1 = TernaryQF([Integer(26), Integer(42), Integer(53), -Integer(36), -Integer(17), -Integer(3)]) >>> Q2 = Q1.find_p_neighbors(Integer(2))[Integer(1)] >>> Q1.omega() 3 >>> Q1.xi(Integer(3)), Q2.xi(Integer(3)) (-1, -1)
- xi_rec(p)[source]¶
Return Xi(p) for the reciprocal form.
EXAMPLES:
sage: Q1 = TernaryQF([1, 1, 7, 0, 0, 0]) sage: Q2 = Q1.find_p_neighbors(3)[0] sage: Q1.delta() 28 sage: Q1.xi_rec(7), Q2.xi_rec(7) (1, 1)
>>> from sage.all import * >>> Q1 = TernaryQF([Integer(1), Integer(1), Integer(7), Integer(0), Integer(0), Integer(0)]) >>> Q2 = Q1.find_p_neighbors(Integer(3))[Integer(0)] >>> Q1.delta() 28 >>> Q1.xi_rec(Integer(7)), Q2.xi_rec(Integer(7)) (1, 1)
- sage.quadratic_forms.ternary_qf.find_a_ternary_qf_by_level_disc(N, d)[source]¶
Find a reduced ternary quadratic form given its discriminant \(d\) and level \(N\). If \(N|4d\) and \(d|N^2\), then it may be a form with that discriminant and level.
EXAMPLES:
sage: Q1 = find_a_ternary_qf_by_level_disc(44, 11); Q1 Ternary quadratic form with integer coefficients: [1 1 3] [0 -1 0] sage: Q2 = find_a_ternary_qf_by_level_disc(44, 11^2 * 16) sage: Q2 Ternary quadratic form with integer coefficients: [3 15 15] [-14 -2 -2] sage: Q1.is_eisenstein_reduced() True sage: Q1.level() 44 sage: Q1.disc() 11 sage: find_a_ternary_qf_by_level_disc(44, 22) sage: find_a_ternary_qf_by_level_disc(44, 33) Traceback (most recent call last): ... ValueError: There are no ternary forms of this level and discriminant
>>> from sage.all import * >>> Q1 = find_a_ternary_qf_by_level_disc(Integer(44), Integer(11)); Q1 Ternary quadratic form with integer coefficients: [1 1 3] [0 -1 0] >>> Q2 = find_a_ternary_qf_by_level_disc(Integer(44), Integer(11)**Integer(2) * Integer(16)) >>> Q2 Ternary quadratic form with integer coefficients: [3 15 15] [-14 -2 -2] >>> Q1.is_eisenstein_reduced() True >>> Q1.level() 44 >>> Q1.disc() 11 >>> find_a_ternary_qf_by_level_disc(Integer(44), Integer(22)) >>> find_a_ternary_qf_by_level_disc(Integer(44), Integer(33)) Traceback (most recent call last): ... ValueError: There are no ternary forms of this level and discriminant
- sage.quadratic_forms.ternary_qf.find_all_ternary_qf_by_level_disc(N, d)[source]¶
Find the coefficients of all the reduced ternary quadratic forms given its discriminant \(d\) and level \(N\).
If \(N|4d\) and \(d|N^2\), then it may be some forms with that discriminant and level.
EXAMPLES:
sage: find_all_ternary_qf_by_level_disc(44, 11) [Ternary quadratic form with integer coefficients: [1 1 3] [0 -1 0], Ternary quadratic form with integer coefficients: [1 1 4] [1 1 1]] sage: find_all_ternary_qf_by_level_disc(44, 11^2 * 16) [Ternary quadratic form with integer coefficients: [3 15 15] [-14 -2 -2], Ternary quadratic form with integer coefficients: [4 11 12] [0 -4 0]] sage: Q = TernaryQF([1, 1, 3, 0, -1, 0]) sage: Q.is_eisenstein_reduced() True sage: Q.reciprocal_reduced() Ternary quadratic form with integer coefficients: [4 11 12] [0 -4 0] sage: find_all_ternary_qf_by_level_disc(44, 22) [] sage: find_all_ternary_qf_by_level_disc(44, 33) Traceback (most recent call last): ... ValueError: There are no ternary forms of this level and discriminant
>>> from sage.all import * >>> find_all_ternary_qf_by_level_disc(Integer(44), Integer(11)) [Ternary quadratic form with integer coefficients: [1 1 3] [0 -1 0], Ternary quadratic form with integer coefficients: [1 1 4] [1 1 1]] >>> find_all_ternary_qf_by_level_disc(Integer(44), Integer(11)**Integer(2) * Integer(16)) [Ternary quadratic form with integer coefficients: [3 15 15] [-14 -2 -2], Ternary quadratic form with integer coefficients: [4 11 12] [0 -4 0]] >>> Q = TernaryQF([Integer(1), Integer(1), Integer(3), Integer(0), -Integer(1), Integer(0)]) >>> Q.is_eisenstein_reduced() True >>> Q.reciprocal_reduced() Ternary quadratic form with integer coefficients: [4 11 12] [0 -4 0] >>> find_all_ternary_qf_by_level_disc(Integer(44), Integer(22)) [] >>> find_all_ternary_qf_by_level_disc(Integer(44), Integer(33)) Traceback (most recent call last): ... ValueError: There are no ternary forms of this level and discriminant