@@ -289,8 +289,6 @@ def __init__(self, systems):
289
289
(x^2 : y^2)
290
290
"""
291
291
292
- self ._domain = systems [0 ].domain ()
293
- self ._codomain = systems [0 ].codomain ()
294
292
self ._dynamical_systems = systems
295
293
Parent .__init__ (self , category = Semigroups ().FinitelyGeneratedAsMagma ())
296
294
@@ -329,7 +327,7 @@ def __call__(self, input):
329
327
TypeError: unable to convert (2 : 1) to an element of Rational Field
330
328
"""
331
329
result = []
332
- for ds in self ._dynamical_systems :
330
+ for ds in self .defining_systems () :
333
331
result .append (ds (self .domain ()(input )))
334
332
return tuple (result )
335
333
@@ -347,7 +345,7 @@ def base_ring(self):
347
345
sage: f.base_ring()
348
346
Rational Field
349
347
"""
350
- return self ._dynamical_systems [0 ].base_ring ()
348
+ return self .defining_systems () [0 ].base_ring ()
351
349
352
350
def change_ring (self , new_ring ):
353
351
r"""
@@ -377,7 +375,7 @@ def change_ring(self, new_ring):
377
375
(x^2 : y^2)
378
376
"""
379
377
new_systems = []
380
- for ds in self ._dynamical_systems :
378
+ for ds in self .defining_systems () :
381
379
new_systems .append (ds .change_ring (new_ring ))
382
380
return DynamicalSemigroup_projective (new_systems )
383
381
@@ -394,7 +392,7 @@ def domain(self):
394
392
sage: f.domain()
395
393
Projective Space of dimension 1 over Rational Field
396
394
"""
397
- return self ._domain
395
+ return self .defining_systems ()[ 0 ]. domain ()
398
396
399
397
def codomain (self ):
400
398
r"""
@@ -409,7 +407,7 @@ def codomain(self):
409
407
sage: f.codomain()
410
408
Projective Space of dimension 1 over Rational Field
411
409
"""
412
- return self ._codomain
410
+ return self .defining_systems ()[ 0 ]. codomain ()
413
411
414
412
def defining_polynomials (self ):
415
413
r"""
@@ -425,7 +423,7 @@ def defining_polynomials(self):
425
423
((x, y), (x^2, y^2))
426
424
"""
427
425
result = []
428
- for ds in self ._dynamical_systems :
426
+ for ds in self .defining_systems () :
429
427
result .append (ds .defining_polynomials ())
430
428
return tuple (result )
431
429
@@ -468,12 +466,12 @@ def _repr_(self):
468
466
(x^2 : y^2)
469
467
"""
470
468
header = "Dynamical semigroup over %s defined by %d dynamical system"
471
- if (len (self ._dynamical_systems ) > 1 ):
469
+ if (len (self .defining_systems () ) > 1 ):
472
470
header += "s"
473
471
header += ":"
474
- header = header % (str (self .domain ()), len (self ._dynamical_systems ))
472
+ header = header % (str (self .domain ()), len (self .defining_systems () ))
475
473
systems = []
476
- for ds in self ._dynamical_systems :
474
+ for ds in self .defining_systems () :
477
475
systems .append (str (ds ))
478
476
systems = '\n ' .join (systems )
479
477
return header + "\n " + systems
@@ -484,36 +482,64 @@ def __eq__(self, other):
484
482
485
483
OUTPUT:
486
484
487
- A boolean that is True if and only if the two dynamical semigroups contain
488
- the same dynamical systems in the same order .
485
+ A boolean that is True if and only if the generators of the two
486
+ dynamical semigroups are equal as sets and no generator is of degree 1 .
489
487
490
488
EXAMPLES::
491
489
492
490
sage: P.<x,y> = ProjectiveSpace(QQ, 1)
493
- sage: f = DynamicalSemigroup(([x, y], [x^2 , y^2 ]))
494
- sage: g = DynamicalSemigroup(([x, y], [x^2 , y^2 ]))
491
+ sage: f = DynamicalSemigroup(([x^2 , y^2 ], [x^3 , y^3 ]))
492
+ sage: g = DynamicalSemigroup(([x^2 , y^2 ], [x^3 , y^3 ]))
495
493
sage: f == g
496
494
True
497
495
498
496
::
499
497
500
498
sage: P.<x,y> = ProjectiveSpace(QQ, 1)
501
- sage: f = DynamicalSemigroup(([x, y], [x^2, y^2]))
502
- sage: g = DynamicalSemigroup(([x^2, y^2], [x, y]))
499
+ sage: f = DynamicalSemigroup(([x^2 , y^2 ], [x^2, y^2]))
500
+ sage: g = DynamicalSemigroup(([x^2, y^2], [x^2 , y^2], [x^2, y^2 ]))
503
501
sage: f == g
504
502
True
505
503
506
504
::
507
505
508
506
sage: P.<x,y> = ProjectiveSpace(QQ, 1)
509
- sage: f = DynamicalSemigroup(([x, y], [x^2, y^2]))
510
- sage: g = DynamicalSemigroup(([x^2, y^2], [y, x ]))
507
+ sage: f = DynamicalSemigroup(([x^3 , y^3 ], [x^2, y^2]))
508
+ sage: g = DynamicalSemigroup(([x^2, y^2], [x^3, y^3 ]))
511
509
sage: f == g
510
+ True
511
+
512
+ ::
513
+
514
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
515
+ sage: f = DynamicalSemigroup(([x^3, y^3], [x^2, y^2]))
516
+ sage: g = DynamicalSemigroup(([x^2, y^2], [y^3, x^3]))
517
+ sage: f == g
518
+ False
519
+
520
+ TESTS::
521
+
522
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
523
+ sage: f = DynamicalSemigroup(([x, y], [x^2, y^2]))
524
+ sage: f == 1
512
525
False
526
+
527
+ ::
528
+
529
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
530
+ sage: f = DynamicalSemigroup(([x, y], [x^2, y^2]))
531
+ sage: g = DynamicalSemigroup(([x^2, y^2], [x^3, y^3]))
532
+ sage: f == g
533
+ Traceback (most recent call last):
534
+ ...
535
+ ValueError: cannot compare dynamical semigroups with at least one generator of degree 1
513
536
"""
514
537
if isinstance (other , DynamicalSemigroup ):
515
- return len (self ._dynamical_systems ) == len (other ._dynamical_systems ) and \
516
- all (systems in other ._dynamical_systems for systems in self ._dynamical_systems )
538
+ if any (ds .degree () == 1 for ds in self .defining_systems ()) or \
539
+ any (ds .degree () == 1 for ds in other .defining_systems ()):
540
+ raise ValueError ("cannot compare dynamical semigroups with at least one generator of degree 1" )
541
+ return all (ds in other .defining_systems () for ds in self .defining_systems ()) and \
542
+ all (ds in self .defining_systems () for ds in other .defining_systems ())
517
543
return False
518
544
519
545
class DynamicalSemigroup_projective (DynamicalSemigroup ):
@@ -702,8 +728,8 @@ def _standardize_domains_of_(systems):
702
728
elif biggest_ring .has_coerce_map_from (ds .base_ring ()):
703
729
pass
704
730
else :
705
- raise ValueError ("given dynamical systems are not automorphic"
706
- " under global composition" )
731
+ raise ValueError ("given dynamical systems are not automorphic \
732
+ under global composition" )
707
733
708
734
for i in range (len (systems )):
709
735
if systems [i ].base_ring () != biggest_ring :
0 commit comments