Path: blob/master/sage/quadratic_forms/random_quadraticform.py
4066 views
"""1Creating A Random Quadratic Form2"""3from sage.quadratic_forms.quadratic_form import QuadraticForm4from sage.rings.ring import is_Ring56################################################7## Routines to create a random quadratic form ##8################################################910def random_quadraticform(R, n, rand_arg_list=[]):11"""12Create a random quadratic form in `n` variables defined over the ring `R`.1314The last (and optional) argument ``rand_arg_list`` is a list of at most 315elements which is passed (as at most 3 separate variables) into the method16``R.random_element()``.1718INPUT:1920- `R` -- a ring.21- `n` -- an integer `\ge 0`22- ``rand_arg_list`` -- a list of at most 3 arguments which can be taken by23``R.random_element()``.2425OUTPUT:2627A quadratic form over the ring `R`.2829EXAMPLES::3031sage: random_quadraticform(ZZ, 3, [1,5]) ## RANDOM32Quadratic form in 3 variables over Integer Ring with coefficients:33[ 3 2 3 ]34[ * 1 4 ]35[ * * 3 ]3637::3839sage: random_quadraticform(ZZ, 3, [-5,5]) ## RANDOM40Quadratic form in 3 variables over Integer Ring with coefficients:41[ 3 2 -5 ]42[ * 2 -2 ]43[ * * -5 ]4445::4647sage: random_quadraticform(ZZ, 3, [-50,50]) ## RANDOM48Quadratic form in 3 variables over Integer Ring with coefficients:49[ 1 8 -23 ]50[ * 0 0 ]51[ * * 6 ]52"""53## Sanity Checks: We have a ring and there are at most 3 parameters for randomness!54if len(rand_arg_list) > 3:55raise TypeError, "Oops! The list of randomness arguments can have at most 3 elements."56if not is_Ring(R):57raise TypeError, "Oops! The first argument must be a ring."5859## Create a list of upper-triangular entries for the quadratic form60L = len(rand_arg_list)61nn = int(n*(n+1)/2)62if L == 0:63rand_list = [R.random_element() for _ in range(nn)]64elif L == 1:65rand_list = [R.random_element(rand_arg_list[0]) for _ in range(nn)]66elif L == 2:67rand_list = [R.random_element(rand_arg_list[0], rand_arg_list[1]) for _ in range(nn)]68elif L == 3:69rand_list = [R.random_element(rand_arg_list[0], rand_arg_list[1], rand_arg_list[2]) for _ in range(nn)]7071## Return the Quadratic Form72return QuadraticForm(R, n, rand_list)737475def random_quadraticform_with_conditions(R, n, condition_list=[], rand_arg_list=[]):76"""77Create a random quadratic form in `n` variables defined over the ring `R`78satisfying a list of boolean (i.e. True/False) conditions.7980The conditions `c` appearing in the list must be boolean functions which81can be called either as ``Q.c()`` or ``c(Q)``, where ``Q`` is the random82quadratic form.8384The last (and optional) argument ``rand_arg_list`` is a list of at most 385elements which is passed (as at most 3 separate variables) into the method86``R.random_element()``.8788EXAMPLES::8990sage: Q = random_quadraticform_with_conditions(ZZ, 3, [QuadraticForm.is_positive_definite], [-5, 5])91sage: Q ## RANDOM92Quadratic form in 3 variables over Integer Ring with coefficients:93[ 3 -2 -5 ]94[ * 2 2 ]95[ * * 3 ]9697"""98Q = random_quadraticform(R, n, rand_arg_list)99Done_Flag = True100101## Check that all conditions are satisfied102while Done_Flag:103Done_Flag = False104for c in condition_list:105106## Check if condition c is satisfied107try:108bool_ans = Q.c()109except:110bool_ans = c(Q)111112## Create a new quadratic form if a condition fails113if (bool_ans == False):114Q = random_quadraticform(R, n, rand_arg_list)115Done_Flag = True116break117118## Return the quadratic form119return Q120121122