Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/quadratic_forms/random_quadraticform.py
4066 views
1
"""
2
Creating A Random Quadratic Form
3
"""
4
from sage.quadratic_forms.quadratic_form import QuadraticForm
5
from sage.rings.ring import is_Ring
6
7
################################################
8
## Routines to create a random quadratic form ##
9
################################################
10
11
def random_quadraticform(R, n, rand_arg_list=[]):
12
"""
13
Create a random quadratic form in `n` variables defined over the ring `R`.
14
15
The last (and optional) argument ``rand_arg_list`` is a list of at most 3
16
elements which is passed (as at most 3 separate variables) into the method
17
``R.random_element()``.
18
19
INPUT:
20
21
- `R` -- a ring.
22
- `n` -- an integer `\ge 0`
23
- ``rand_arg_list`` -- a list of at most 3 arguments which can be taken by
24
``R.random_element()``.
25
26
OUTPUT:
27
28
A quadratic form over the ring `R`.
29
30
EXAMPLES::
31
32
sage: random_quadraticform(ZZ, 3, [1,5]) ## RANDOM
33
Quadratic form in 3 variables over Integer Ring with coefficients:
34
[ 3 2 3 ]
35
[ * 1 4 ]
36
[ * * 3 ]
37
38
::
39
40
sage: random_quadraticform(ZZ, 3, [-5,5]) ## RANDOM
41
Quadratic form in 3 variables over Integer Ring with coefficients:
42
[ 3 2 -5 ]
43
[ * 2 -2 ]
44
[ * * -5 ]
45
46
::
47
48
sage: random_quadraticform(ZZ, 3, [-50,50]) ## RANDOM
49
Quadratic form in 3 variables over Integer Ring with coefficients:
50
[ 1 8 -23 ]
51
[ * 0 0 ]
52
[ * * 6 ]
53
"""
54
## Sanity Checks: We have a ring and there are at most 3 parameters for randomness!
55
if len(rand_arg_list) > 3:
56
raise TypeError, "Oops! The list of randomness arguments can have at most 3 elements."
57
if not is_Ring(R):
58
raise TypeError, "Oops! The first argument must be a ring."
59
60
## Create a list of upper-triangular entries for the quadratic form
61
L = len(rand_arg_list)
62
nn = int(n*(n+1)/2)
63
if L == 0:
64
rand_list = [R.random_element() for _ in range(nn)]
65
elif L == 1:
66
rand_list = [R.random_element(rand_arg_list[0]) for _ in range(nn)]
67
elif L == 2:
68
rand_list = [R.random_element(rand_arg_list[0], rand_arg_list[1]) for _ in range(nn)]
69
elif L == 3:
70
rand_list = [R.random_element(rand_arg_list[0], rand_arg_list[1], rand_arg_list[2]) for _ in range(nn)]
71
72
## Return the Quadratic Form
73
return QuadraticForm(R, n, rand_list)
74
75
76
def random_quadraticform_with_conditions(R, n, condition_list=[], rand_arg_list=[]):
77
"""
78
Create a random quadratic form in `n` variables defined over the ring `R`
79
satisfying a list of boolean (i.e. True/False) conditions.
80
81
The conditions `c` appearing in the list must be boolean functions which
82
can be called either as ``Q.c()`` or ``c(Q)``, where ``Q`` is the random
83
quadratic form.
84
85
The last (and optional) argument ``rand_arg_list`` is a list of at most 3
86
elements which is passed (as at most 3 separate variables) into the method
87
``R.random_element()``.
88
89
EXAMPLES::
90
91
sage: Q = random_quadraticform_with_conditions(ZZ, 3, [QuadraticForm.is_positive_definite], [-5, 5])
92
sage: Q ## RANDOM
93
Quadratic form in 3 variables over Integer Ring with coefficients:
94
[ 3 -2 -5 ]
95
[ * 2 2 ]
96
[ * * 3 ]
97
98
"""
99
Q = random_quadraticform(R, n, rand_arg_list)
100
Done_Flag = True
101
102
## Check that all conditions are satisfied
103
while Done_Flag:
104
Done_Flag = False
105
for c in condition_list:
106
107
## Check if condition c is satisfied
108
try:
109
bool_ans = Q.c()
110
except:
111
bool_ans = c(Q)
112
113
## Create a new quadratic form if a condition fails
114
if (bool_ans == False):
115
Q = random_quadraticform(R, n, rand_arg_list)
116
Done_Flag = True
117
break
118
119
## Return the quadratic form
120
return Q
121
122