@@ -158,8 +158,6 @@ def balanced_incomplete_block_design(v, k, lambd=1, existence=False, use_LJCR=Fa
158
158
(66,6,1)-Balanced Incomplete Block Design
159
159
sage: B.blocks() # optional - internet
160
160
[[0, 1, 2, 3, 4, 65], [0, 5, 22, 32, 38, 58], [0, 6, 21, 30, 43, 48], ...
161
- sage: designs.balanced_incomplete_block_design(66, 6, 1, use_LJCR=True) # optional - internet
162
- (66,6,1)-Balanced Incomplete Block Design
163
161
sage: designs.balanced_incomplete_block_design(216, 6, 1)
164
162
Traceback (most recent call last):
165
163
...
@@ -240,12 +238,12 @@ def balanced_incomplete_block_design(v, k, lambd=1, existence=False, use_LJCR=Fa
240
238
if v == 1 :
241
239
if existence :
242
240
return True
243
- return BalancedIncompleteBlockDesign (v , [], check = False )
241
+ return BIBD (v , [], check = False )
244
242
245
243
if k == v :
246
244
if existence :
247
245
return True
248
- return BalancedIncompleteBlockDesign (v , [list (range (v )) for _ in range (lambd )],lambd = lambd , check = False , copy = False )
246
+ return BIBD (v , [list (range (v )) for _ in range (lambd )],lambd = lambd , check = False , copy = False )
249
247
250
248
# Non-existence of BIBD
251
249
if (v < k or
@@ -273,62 +271,70 @@ def balanced_incomplete_block_design(v, k, lambd=1, existence=False, use_LJCR=Fa
273
271
if k == 2 :
274
272
if existence :
275
273
return True
276
- return BalancedIncompleteBlockDesign (v , [[x , y ] for _ in range (lambd ) for x in range (v ) for y in range (x + 1 , v ) if x != y ], lambd = lambd , check = False , copy = True )
274
+ return BIBD (v , [[x , y ] for _ in range (lambd ) for x in range (v ) for y in range (x + 1 , v ) if x != y ], lambd = lambd , check = False , copy = True )
277
275
if k == 3 and lambd == 1 :
278
276
if existence :
279
277
return v % 6 == 1 or v % 6 == 3
280
278
return steiner_triple_system (v )
281
279
if k == 4 and lambd == 1 :
282
280
if existence :
283
281
return v % 12 == 1 or v % 12 == 4
284
- return BalancedIncompleteBlockDesign (v , v_4_1_BIBD (v ), copy = False )
282
+ return BIBD (v , v_4_1_BIBD (v ), copy = False )
285
283
if k == 5 and lambd == 1 :
286
284
if existence :
287
285
return v % 20 == 1 or v % 20 == 5
288
- return BalancedIncompleteBlockDesign (v , v_5_1_BIBD (v ), copy = False )
286
+ return BIBD (v , v_5_1_BIBD (v ), copy = False )
289
287
290
288
from .difference_family import difference_family
291
289
from .database import BIBD_constructions
292
290
293
291
if (v , k , lambd ) in BIBD_constructions :
294
292
if existence :
295
293
return True
296
- return BalancedIncompleteBlockDesign (v ,BIBD_constructions [(v , k , lambd )](), lambd = lambd , copy = False )
294
+ return BIBD (v ,BIBD_constructions [(v , k , lambd )](), lambd = lambd , copy = False )
297
295
if lambd == 1 and BIBD_from_arc_in_desarguesian_projective_plane (v , k , existence = True ):
298
296
if existence :
299
297
return True
300
298
B = BIBD_from_arc_in_desarguesian_projective_plane (v , k )
301
- return BalancedIncompleteBlockDesign (v , B , copy = False )
299
+ return BIBD (v , B , copy = False )
302
300
if lambd == 1 and BIBD_from_TD (v , k , existence = True ) is True :
303
301
if existence :
304
302
return True
305
- return BalancedIncompleteBlockDesign (v , BIBD_from_TD (v , k ), copy = False )
303
+ return BIBD (v , BIBD_from_TD (v , k ), copy = False )
306
304
if lambd == 1 and v == (k - 1 )** 2 + k and is_prime_power (k - 1 ):
307
305
if existence :
308
306
return True
309
307
from .block_design import projective_plane
310
- return BalancedIncompleteBlockDesign (v , projective_plane (k - 1 ),copy = False )
308
+ return BIBD (v , projective_plane (k - 1 ),copy = False )
311
309
if difference_family (v , k , l = lambd , existence = True ) is True :
312
310
if existence :
313
311
return True
314
312
G , D = difference_family (v , k , l = lambd )
315
- return BalancedIncompleteBlockDesign (v , BIBD_from_difference_family (G , D , check = False ), lambd = lambd , copy = False )
313
+ return BIBD (v , BIBD_from_difference_family (G , D , check = False ), lambd = lambd , copy = False )
316
314
if lambd == 1 and use_LJCR :
317
315
from .covering_design import best_known_covering_design_www
318
- B = best_known_covering_design_www (v , k , 2 )
319
-
320
- # Is it a BIBD or just a good covering ?
321
- expected_n_of_blocks = binomial (v , 2 )// binomial (k , 2 )
322
- if B .low_bd () > expected_n_of_blocks :
323
- if existence :
324
- return False
325
- raise EmptySetError ("There exists no ({},{},{})-BIBD" .format (v , k , lambd ))
326
- B = B .incidence_structure ()
327
- if B .num_blocks () == expected_n_of_blocks :
328
- if existence :
329
- return True
330
- else :
331
- return B
316
+ values_in_db = False
317
+ try :
318
+ B = best_known_covering_design_www (v , k , 2 )
319
+ values_in_db = True
320
+ except ValueError :
321
+ # the parameters are not in the LJCR database
322
+ pass
323
+
324
+ if values_in_db :
325
+ # Is it a BIBD or just a good covering?
326
+ expected_n_of_blocks = binomial (v , 2 ) // binomial (k , 2 )
327
+ if B .low_bd () > expected_n_of_blocks :
328
+ if existence :
329
+ return False
330
+ raise EmptySetError (f"there exists no ({ v } ,{ k } ,{ lambd } )-BIBD" )
331
+ B = B .incidence_structure ()
332
+ if B .num_blocks () == expected_n_of_blocks :
333
+ if existence :
334
+ return True
335
+ else :
336
+ return BIBD (B .ground_set (), B .blocks (), k = k , lambd = 1 , copy = False )
337
+
332
338
333
339
if ( (k + lambd )* (k + lambd - 1 ) == lambd * (v + k + lambd - 1 ) and
334
340
balanced_incomplete_block_design (v + k + lambd , k + lambd , lambd , existence = True ) is True ):
@@ -511,7 +517,7 @@ def steiner_triple_system(n):
511
517
# apply T and remove duplicates
512
518
sts = set (frozenset (T (xx ) for xx in x ) for x in sts )
513
519
514
- return BalancedIncompleteBlockDesign (n , sts , name = name ,check = False )
520
+ return BIBD (n , sts , name = name ,check = False )
515
521
516
522
517
523
def BIBD_from_TD (v ,k ,existence = False ):
@@ -1204,10 +1210,6 @@ def _get_r_s_t_u(v):
1204
1210
t ,u = 30 * s + 5 , 5
1205
1211
elif x <= 51 :
1206
1212
t ,u = 30 * s + 5 , x - 25
1207
- elif x <= 66 :
1208
- t ,u = 30 * s + 11 , x - 55
1209
- elif x <= 96 :
1210
- t ,u = 30 * s + 11 , x - 55
1211
1213
elif x <= 121 :
1212
1214
t ,u = 30 * s + 11 , x - 55
1213
1215
elif x <= 146 :
@@ -1638,3 +1640,5 @@ def arc(self, s=2, solver=None, verbose=0):
1638
1640
p .add_constraint (p .sum (b [k ] for k in i ) <= s )
1639
1641
p .solve (log = verbose )
1640
1642
return [self ._points [i ] for (i ,j ) in p .get_values (b ).items () if j == 1 ]
1643
+
1644
+ BIBD = BalancedIncompleteBlockDesign
0 commit comments