| 1 | initial version |
A simple answer is to select a random subset of the basis of your vector space and multiply them by a random subset of the vector space base ring. Core implementation :
sage: def rv(R, p): return list(map(lambda a,b:a*b
random.sample(R.basis(), p),
random.sample(R.base_ring().list(), p)))
sage: rv(v, 5)
[(0, 0, 8, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 7, 0, 0),
(0, 0, 0, 0, 2, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 9, 0),
(0, 0, 0, 0, 0, 0, 0, 6)]
This version lacks basic checks (number oif elements <= vector space diension, finite base ring, etc...). Of course, this will sample only a small subset of your vector space. It will return quickly (the algorithm is deterministic).
If you want to sample all your vector space, you can brute-force sample p elements from it until the p elements are independent :
sage: def rv2(R, p):
....: S = [R.random_element() for u in range(p)]
....: while len(R.linear_dependence(S))>0 :
....: S = [R.random_element() for u in range(p)]
....: return S
....:
sage: rv2(v, 3)
[(8, 5, 2, 10, 0, 8, 6, 3), (4, 8, 4, 3, 1, 5, 0, 7), (7, 3, 3, 9, 8, 4, 4, 1)]
Again, basic checks must be added. Credit where credit is due : this solution is inspired from this answer. Its based on the supposition that R.random_element() actually samples R efficiently and correctly. Note also that the algorithm is non deterministic (and therefore has no upper bound for execution time...).
HTH,
| 2 | No.2 Revision |
A simple answer is to select a random subset of the basis of your vector space and multiply them by a random subset of the vector space base ring. Core implementation :
sage: def rv(R, p): return list(map(lambda a,b:a*b
random.sample(R.basis(), p),
random.sample(R.base_ring().list(), p)))
sage: rv(v, 5)
[(0, 0, 8, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 7, 0, 0),
(0, 0, 0, 0, 2, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 9, 0),
(0, 0, 0, 0, 0, 0, 0, 6)]
This version lacks basic checks (number oif elements <= vector space diension, finite base ring, etc...). Of course, this will sample only a small subset of your vector space. It will return quickly (the algorithm is deterministic).
If you want to sample all your vector space, you can brute-force sample p elements from it until the p elements are independent :
sage: def rv2(R, p):
....: S = [R.random_element() for u in range(p)]
....: while len(R.linear_dependence(S))>0 :
....: S = [R.random_element() for u in range(p)]
....: return S
....:
sage: rv2(v, 3)
[(8, 5, 2, 10, 0, 8, 6, 3), (4, 8, 4, 3, 1, 5, 0, 7), (7, 3, 3, 9, 8, 4, 4, 1)]
Again, basic checks must be added. Credit where credit is due : this solution is inspired from this answer. Its based on the supposition that R.random_element() actually samples R efficiently and correctly. Note also that the algorithm is non deterministic (and therefore has no upper bound for execution time...).
A better answer is given here :
sage: def rv3(R, p):
....: q=len((R1:=R.base_ring()).list())
....: return [Matrix( SL(q, R1).random_element()).rows()[u] for u in random.sample(range(q), p)]
....:
sage: rv3(v, 3)
[(6, 4, 4, 0, 3, 3, 10, 0, 0, 0, 10),
(4, 7, 2, 2, 1, 6, 6, 10, 5, 4, 2),
(0, 5, 4, 2, 5, 7, 10, 1, 0, 6, 0)]
One may finally note that the two latter solutions were among the first five answers to googling sagemath check that vectors are linearly independent...
HTH,
Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.