54
54
#*****************************************************************************
55
55
from sage .arith .misc import binomial , integer_floor , is_prime_power
56
56
from sage .categories .sets_cat import EmptySetError
57
- from sage .modules .free_module import VectorSpace
57
+ from sage .misc .lazy_import import lazy_import
58
+ from sage .misc .unknown import Unknown
58
59
from sage .rings .integer import Integer
59
60
from sage .rings .integer_ring import ZZ
61
+
60
62
from .incidence_structures import IncidenceStructure
61
- from sage .rings .finite_rings .finite_field_constructor import FiniteField
62
- from sage .misc .unknown import Unknown
63
- from sage .matrix .matrix_space import MatrixSpace
64
- from sage .libs .gap .libgap import libgap
63
+
64
+ lazy_import ('sage.libs.gap.libgap' , 'libgap' )
65
+ lazy_import ('sage.matrix.matrix_space' , 'MatrixSpace' )
66
+ lazy_import ('sage.modules.free_module' , 'VectorSpace' )
67
+ lazy_import ('sage.rings.finite_rings.finite_field_constructor' , 'FiniteField' )
65
68
66
69
67
70
BlockDesign = IncidenceStructure
@@ -214,30 +217,30 @@ def ProjectiveGeometryDesign(n, d, F, algorithm=None, point_coordinates=True, ch
214
217
The set of `d`-dimensional subspaces in a `n`-dimensional projective space
215
218
forms `2`-designs (or balanced incomplete block designs)::
216
219
217
- sage: PG = designs.ProjectiveGeometryDesign(4, 2, GF(2)); PG # optional - sage.rings.finite_rings
220
+ sage: PG = designs.ProjectiveGeometryDesign(4, 2, GF(2)); PG
218
221
Incidence structure with 31 points and 155 blocks
219
- sage: PG.is_t_design(return_parameters=True) # optional - sage.rings.finite_rings
222
+ sage: PG.is_t_design(return_parameters=True)
220
223
(True, (2, 31, 7, 7))
221
224
222
- sage: PG = designs.ProjectiveGeometryDesign(3, 1, GF(4)) # optional - sage.rings.finite_rings
223
- sage: PG.is_t_design(return_parameters=True) # optional - sage.rings.finite_rings
225
+ sage: PG = designs.ProjectiveGeometryDesign(3, 1, GF(4))
226
+ sage: PG.is_t_design(return_parameters=True)
224
227
(True, (2, 85, 5, 1))
225
228
226
229
Check with ``F`` being a prime power::
227
230
228
- sage: PG = designs.ProjectiveGeometryDesign(3, 2, 4); PG # optional - sage.rings.finite_rings
231
+ sage: PG = designs.ProjectiveGeometryDesign(3, 2, 4); PG
229
232
Incidence structure with 85 points and 85 blocks
230
233
231
234
Use coordinates::
232
235
233
- sage: PG = designs.ProjectiveGeometryDesign(2, 1, GF(3)) # optional - sage.rings.finite_rings
234
- sage: PG.blocks()[0] # optional - sage.rings.finite_rings
236
+ sage: PG = designs.ProjectiveGeometryDesign(2, 1, GF(3))
237
+ sage: PG.blocks()[0]
235
238
[(1, 0, 0), (1, 0, 1), (1, 0, 2), (0, 0, 1)]
236
239
237
240
Use indexing by integers::
238
241
239
- sage: PG = designs.ProjectiveGeometryDesign(2, 1, GF(3), point_coordinates=0) # optional - sage.rings.finite_rings
240
- sage: PG.blocks()[0] # optional - sage.rings.finite_rings
242
+ sage: PG = designs.ProjectiveGeometryDesign(2, 1, GF(3), point_coordinates=0)
243
+ sage: PG.blocks()[0]
241
244
[0, 1, 2, 12]
242
245
243
246
Check that the constructor using gap also works::
@@ -318,15 +321,15 @@ def DesarguesianProjectivePlaneDesign(n, point_coordinates=True, check=True):
318
321
319
322
EXAMPLES::
320
323
321
- sage: designs.DesarguesianProjectivePlaneDesign(2) # optional - sage.rings.finite_rings
324
+ sage: designs.DesarguesianProjectivePlaneDesign(2)
322
325
(7,3,1)-Balanced Incomplete Block Design
323
- sage: designs.DesarguesianProjectivePlaneDesign(3) # optional - sage.rings.finite_rings
326
+ sage: designs.DesarguesianProjectivePlaneDesign(3)
324
327
(13,4,1)-Balanced Incomplete Block Design
325
- sage: designs.DesarguesianProjectivePlaneDesign(4) # optional - sage.rings.finite_rings
328
+ sage: designs.DesarguesianProjectivePlaneDesign(4)
326
329
(21,5,1)-Balanced Incomplete Block Design
327
- sage: designs.DesarguesianProjectivePlaneDesign(5) # optional - sage.rings.finite_rings
330
+ sage: designs.DesarguesianProjectivePlaneDesign(5)
328
331
(31,6,1)-Balanced Incomplete Block Design
329
- sage: designs.DesarguesianProjectivePlaneDesign(6) # optional - sage.rings.finite_rings
332
+ sage: designs.DesarguesianProjectivePlaneDesign(6)
330
333
Traceback (most recent call last):
331
334
...
332
335
ValueError: the order of a finite field must be a prime power
@@ -400,20 +403,20 @@ def q3_minus_one_matrix(K):
400
403
EXAMPLES::
401
404
402
405
sage: from sage.combinat.designs.block_design import q3_minus_one_matrix
403
- sage: m = q3_minus_one_matrix(GF(3)) # optional - sage.rings.finite_rings
404
- sage: m.multiplicative_order() == 3**3 - 1 # optional - sage.rings.finite_rings
406
+ sage: m = q3_minus_one_matrix(GF(3))
407
+ sage: m.multiplicative_order() == 3**3 - 1
405
408
True
406
409
407
- sage: m = q3_minus_one_matrix(GF(4, 'a')) # optional - sage.rings.finite_rings
408
- sage: m.multiplicative_order() == 4**3 - 1 # optional - sage.rings.finite_rings
410
+ sage: m = q3_minus_one_matrix(GF(4, 'a'))
411
+ sage: m.multiplicative_order() == 4**3 - 1
409
412
True
410
413
411
- sage: m = q3_minus_one_matrix(GF(5)) # optional - sage.rings.finite_rings
412
- sage: m.multiplicative_order() == 5**3 - 1 # optional - sage.rings.finite_rings
414
+ sage: m = q3_minus_one_matrix(GF(5))
415
+ sage: m.multiplicative_order() == 5**3 - 1
413
416
True
414
417
415
- sage: m = q3_minus_one_matrix(GF(9, 'a')) # optional - sage.rings.finite_rings
416
- sage: m.multiplicative_order() == 9**3 - 1 # optional - sage.rings.finite_rings
418
+ sage: m = q3_minus_one_matrix(GF(9, 'a'))
419
+ sage: m.multiplicative_order() == 9**3 - 1
417
420
True
418
421
"""
419
422
q = K .cardinality ()
@@ -450,24 +453,24 @@ def normalize_hughes_plane_point(p, q):
450
453
451
454
INPUT:
452
455
453
- - ``p`` -- point with the coordinates (x,y,z) (a list, a vector, a tuple...)
456
+ - ``p`` -- point with the coordinates ` (x,y,z)` (a list, a vector, a tuple...)
454
457
455
458
- ``q`` -- cardinality of the underlying finite field
456
459
457
460
EXAMPLES::
458
461
459
462
sage: from sage.combinat.designs.block_design import normalize_hughes_plane_point
460
- sage: K = FiniteField(9,'x') # optional - sage.rings.finite_rings
461
- sage: x = K.gen() # optional - sage.rings.finite_rings
462
- sage: normalize_hughes_plane_point((x, x+ 1, x), 9) # optional - sage.rings.finite_rings
463
+ sage: K = FiniteField(9,'x')
464
+ sage: x = K.gen()
465
+ sage: normalize_hughes_plane_point((x, x + 1, x), 9)
463
466
(1, x, 1)
464
- sage: normalize_hughes_plane_point(vector((x,x,x)), 9) # optional - sage.rings.finite_rings
467
+ sage: normalize_hughes_plane_point(vector((x,x,x)), 9)
465
468
(1, 1, 1)
466
- sage: zero = K.zero() # optional - sage.rings.finite_rings
467
- sage: normalize_hughes_plane_point((2*x+ 2, zero, zero), 9) # optional - sage.rings.finite_rings
469
+ sage: zero = K.zero()
470
+ sage: normalize_hughes_plane_point((2*x + 2, zero, zero), 9)
468
471
(1, 0, 0)
469
- sage: one = K.one() # optional - sage.rings.finite_rings
470
- sage: normalize_hughes_plane_point((2*x, one, zero), 9) # optional - sage.rings.finite_rings
472
+ sage: one = K.one()
473
+ sage: normalize_hughes_plane_point((2*x, one, zero), 9)
471
474
(2*x, 1, 0)
472
475
"""
473
476
for i in [2 ,1 ,0 ]:
@@ -526,7 +529,7 @@ def HughesPlane(q2, check=True):
526
529
527
530
EXAMPLES::
528
531
529
- sage: H = designs.HughesPlane(9); H # optional - sage.rings.finite_rings
532
+ sage: H = designs.HughesPlane(9); H
530
533
(91,10,1)-Balanced Incomplete Block Design
531
534
532
535
We prove in the following computations that the Desarguesian plane ``H`` is
@@ -535,45 +538,45 @@ def HughesPlane(q2, check=True):
535
538
`D_{1,10} \cap D_{70,59}` and `D_{10,0} \cap D_{59,57}` are on the same line
536
539
while `D_{0,70}`, `D_{1,59}` and `D_{10,57}` are not concurrent::
537
540
538
- sage: blocks = H.blocks() # optional - sage.rings.finite_rings
539
- sage: line = lambda p,q: next(b for b in blocks if p in b and q in b) # optional - sage.rings.finite_rings
541
+ sage: blocks = H.blocks()
542
+ sage: line = lambda p,q: next(b for b in blocks if p in b and q in b)
540
543
541
- sage: b_0_1 = line(0, 1) # optional - sage.rings.finite_rings
542
- sage: b_1_10 = line(1, 10) # optional - sage.rings.finite_rings
543
- sage: b_10_0 = line(10, 0) # optional - sage.rings.finite_rings
544
- sage: b_57_70 = line(57, 70) # optional - sage.rings.finite_rings
545
- sage: b_70_59 = line(70, 59) # optional - sage.rings.finite_rings
546
- sage: b_59_57 = line(59, 57) # optional - sage.rings.finite_rings
544
+ sage: b_0_1 = line(0, 1)
545
+ sage: b_1_10 = line(1, 10)
546
+ sage: b_10_0 = line(10, 0)
547
+ sage: b_57_70 = line(57, 70)
548
+ sage: b_70_59 = line(70, 59)
549
+ sage: b_59_57 = line(59, 57)
547
550
548
- sage: set(b_0_1).intersection(b_57_70) # optional - sage.rings.finite_rings
551
+ sage: set(b_0_1).intersection(b_57_70)
549
552
{2}
550
- sage: set(b_1_10).intersection(b_70_59) # optional - sage.rings.finite_rings
553
+ sage: set(b_1_10).intersection(b_70_59)
551
554
{73}
552
- sage: set(b_10_0).intersection(b_59_57) # optional - sage.rings.finite_rings
555
+ sage: set(b_10_0).intersection(b_59_57)
553
556
{60}
554
557
555
- sage: line(2, 73) == line(73, 60) # optional - sage.rings.finite_rings
558
+ sage: line(2, 73) == line(73, 60)
556
559
True
557
560
558
- sage: b_0_57 = line(0, 57) # optional - sage.rings.finite_rings
559
- sage: b_1_70 = line(1, 70) # optional - sage.rings.finite_rings
560
- sage: b_10_59 = line(10, 59) # optional - sage.rings.finite_rings
561
+ sage: b_0_57 = line(0, 57)
562
+ sage: b_1_70 = line(1, 70)
563
+ sage: b_10_59 = line(10, 59)
561
564
562
- sage: p = set(b_0_57).intersection(b_1_70) # optional - sage.rings.finite_rings
563
- sage: q = set(b_1_70).intersection(b_10_59) # optional - sage.rings.finite_rings
564
- sage: p == q # optional - sage.rings.finite_rings
565
+ sage: p = set(b_0_57).intersection(b_1_70)
566
+ sage: q = set(b_1_70).intersection(b_10_59)
567
+ sage: p == q
565
568
False
566
569
567
570
TESTS:
568
571
569
572
Some wrong input::
570
573
571
- sage: designs.HughesPlane(5) # optional - sage.rings.finite_rings
574
+ sage: designs.HughesPlane(5)
572
575
Traceback (most recent call last):
573
576
...
574
577
EmptySetError: No Hughes plane of non-square order exists.
575
578
576
- sage: designs.HughesPlane(16) # optional - sage.rings.finite_rings
579
+ sage: designs.HughesPlane(16)
577
580
Traceback (most recent call last):
578
581
...
579
582
EmptySetError: No Hughes plane of even order exists.
@@ -644,13 +647,11 @@ def projective_plane_to_OA(pplane, pt=None, check=True):
644
647
EXAMPLES::
645
648
646
649
sage: from sage.combinat.designs.block_design import projective_plane_to_OA
647
- sage: p2 = designs.DesarguesianProjectivePlaneDesign(2, # optional - sage.rings.finite_rings
648
- ....: point_coordinates=False)
649
- sage: projective_plane_to_OA(p2) # optional - sage.rings.finite_rings
650
+ sage: p2 = designs.DesarguesianProjectivePlaneDesign(2, point_coordinates=False)
651
+ sage: projective_plane_to_OA(p2)
650
652
[[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0]]
651
- sage: p3 = designs.DesarguesianProjectivePlaneDesign(3, # optional - sage.rings.finite_rings
652
- ....: point_coordinates=False)
653
- sage: projective_plane_to_OA(p3) # optional - sage.rings.finite_rings
653
+ sage: p3 = designs.DesarguesianProjectivePlaneDesign(3, point_coordinates=False)
654
+ sage: projective_plane_to_OA(p3)
654
655
[[0, 0, 0, 0],
655
656
[0, 1, 2, 1],
656
657
[0, 2, 1, 2],
@@ -661,11 +662,10 @@ def projective_plane_to_OA(pplane, pt=None, check=True):
661
662
[2, 1, 0, 2],
662
663
[2, 2, 2, 0]]
663
664
664
- sage: pp = designs.DesarguesianProjectivePlaneDesign(16, # optional - sage.rings.finite_rings
665
- ....: point_coordinates=False)
666
- sage: _ = projective_plane_to_OA(pp, pt=0) # optional - sage.rings.finite_rings
667
- sage: _ = projective_plane_to_OA(pp, pt=3) # optional - sage.rings.finite_rings
668
- sage: _ = projective_plane_to_OA(pp, pt=7) # optional - sage.rings.finite_rings
665
+ sage: pp = designs.DesarguesianProjectivePlaneDesign(16, point_coordinates=False)
666
+ sage: _ = projective_plane_to_OA(pp, pt=0)
667
+ sage: _ = projective_plane_to_OA(pp, pt=3)
668
+ sage: _ = projective_plane_to_OA(pp, pt=7)
669
669
"""
670
670
from .bibd import _relabel_bibd
671
671
pplane = pplane .blocks ()
@@ -816,28 +816,28 @@ def AffineGeometryDesign(n, d, F, point_coordinates=True, check=True):
816
816
817
817
EXAMPLES::
818
818
819
- sage: BD = designs.AffineGeometryDesign(3, 1, GF(2)) # optional - sage.rings.finite_rings
820
- sage: BD.is_t_design(return_parameters=True) # optional - sage.rings.finite_rings
819
+ sage: BD = designs.AffineGeometryDesign(3, 1, GF(2))
820
+ sage: BD.is_t_design(return_parameters=True)
821
821
(True, (2, 8, 2, 1))
822
- sage: BD = designs.AffineGeometryDesign(3, 2, GF(4)) # optional - sage.rings.finite_rings
823
- sage: BD.is_t_design(return_parameters=True) # optional - sage.rings.finite_rings
822
+ sage: BD = designs.AffineGeometryDesign(3, 2, GF(4))
823
+ sage: BD.is_t_design(return_parameters=True)
824
824
(True, (2, 64, 16, 5))
825
- sage: BD = designs.AffineGeometryDesign(4, 2, GF(3)) # optional - sage.rings.finite_rings
826
- sage: BD.is_t_design(return_parameters=True) # optional - sage.rings.finite_rings
825
+ sage: BD = designs.AffineGeometryDesign(4, 2, GF(3))
826
+ sage: BD.is_t_design(return_parameters=True)
827
827
(True, (2, 81, 9, 13))
828
828
829
829
With ``F`` an integer instead of a finite field::
830
830
831
- sage: BD = designs.AffineGeometryDesign(3, 2, 4) # optional - sage.rings.finite_rings
832
- sage: BD.is_t_design(return_parameters=True) # optional - sage.rings.finite_rings
831
+ sage: BD = designs.AffineGeometryDesign(3, 2, 4)
832
+ sage: BD.is_t_design(return_parameters=True)
833
833
(True, (2, 64, 16, 5))
834
834
835
835
Testing the option ``point_coordinates``::
836
836
837
- sage: designs.AffineGeometryDesign(3, 1, GF(2), # optional - sage.rings.finite_rings
837
+ sage: designs.AffineGeometryDesign(3, 1, GF(2),
838
838
....: point_coordinates=True).blocks()[0]
839
839
[(0, 0, 0), (0, 0, 1)]
840
- sage: designs.AffineGeometryDesign(3, 1, GF(2), # optional - sage.rings.finite_rings
840
+ sage: designs.AffineGeometryDesign(3, 1, GF(2),
841
841
....: point_coordinates=False).blocks()[0]
842
842
[0, 1]
843
843
"""
0 commit comments