Quadratic form extras


Given a matrix (resp. list of vectors), extend it to a square matrix (resp. list of vectors), such that its determinant is the gcd of its minors (i.e. extend the basis of a lattice to a “maximal” one in Z^n).

Author(s): Gonzalo Tornaria and Jonathan Hanke.


a matrix, or a list of length n vectors (in the same space)


a square matrix, or a list of n vectors (resp.)


sage: A = Matrix(ZZ, 3, 2, range(6))
sage: extend_to_primitive(A)
[ 0  1  0]
[ 2  3  0]
[ 4  5 -1]

sage: extend_to_primitive([vector([1,2,3])])
[(1, 2, 3), (0, 1, 0), (0, 0, 1)]
sage.quadratic_forms.extras.is_triangular_number(n, return_value=False)

Return whether n is a triangular number.

A triangular number is a number of the form \(k(k+1)/2\) for some non-negative integer \(n\). See Wikipedia article Triangular_number. The sequence of triangular number is references as A000217 in the Online encyclopedia of integer sequences (OEIS).

If you want to get the value of \(k\) for which \(n=k(k+1)/2\) set the argument return_value to True (see the examples below).


  • n - an integer
  • return_value - a boolean set to False by default. If set to True the function returns a pair made of a boolean and the value v such that \(v(v+1)/2 = n\).


sage: is_triangular_number(3)
sage: is_triangular_number(3, return_value=True)
(True, 2)
sage: 2*(2+1)/2

sage: is_triangular_number(2)
sage: is_triangular_number(2, return_value=True)
(False, None)

sage: is_triangular_number(25*(25+1)/2)

sage: is_triangular_number(10^6 * (10^6 +1)/2, return_value=True)
(True, 1000000)

Returns the smallest positive integer quadratic non-residue in Z/pZ for primes p>2.


sage: least_quadratic_nonresidue(5)
sage: [least_quadratic_nonresidue(p) for p in prime_range(3,100)]
[2, 2, 3, 2, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 2, 2, 2, 7, 5, 3, 2, 3, 5]
sage: least_quadratic_nonresidue(20)
Traceback (most recent call last):
ValueError: Oops!  p must be a prime number > 2.

Raises an error if input is 2. This is because every integer is a quadratic residue modulo 2.

sage: least_quadratic_nonresidue(2)
Traceback (most recent call last):
ValueError: Oops!  There are no quadratic non-residues in Z/2Z.