9
9
- Dang Phan (August 6th, 2023): initial implementation
10
10
"""
11
11
12
- #* ****************************************************************************
12
+ # ****************************************************************************
13
13
14
14
#
15
15
# This program is free software: you can redistribute it and/or modify
16
16
# it under the terms of the GNU General Public License as published by
17
17
# the Free Software Foundation, either version 2 of the License, or
18
18
# (at your option) any later version.
19
- # http ://www.gnu.org/licenses/
20
- #* ****************************************************************************
19
+ # https ://www.gnu.org/licenses/
20
+ # ****************************************************************************
21
21
22
22
from collections .abc import Collection
23
23
from sage .categories .fields import Fields
33
33
from sage .rings .rational_field import QQ
34
34
from sage .structure .parent import Parent
35
35
36
+
36
37
class DynamicalSemigroup (Parent , metaclass = InheritComparisonClasscallMetaclass ):
37
38
r"""
38
39
A dynamical semigroup defined by a multiple dynamical systems on projective or affine space.
@@ -959,16 +960,15 @@ def __mul__(self, other_dynamical_semigroup):
959
960
Traceback (most recent call last):
960
961
...
961
962
ValueError: left dynamical semigroup's domain must equal right dynamical semigroup's codomain
962
-
963
963
"""
964
- if type (self ) != type (other_dynamical_semigroup ):
964
+ if type (self ) is not type (other_dynamical_semigroup ):
965
965
raise TypeError ("can only multiply dynamical semigroups with other dynamical semigroups of the same type" )
966
966
if self .domain () != other_dynamical_semigroup .codomain ():
967
967
raise ValueError ("left dynamical semigroup's domain must equal right dynamical semigroup's codomain" )
968
968
composite_systems = []
969
969
for f in self .defining_systems ():
970
970
for g in other_dynamical_semigroup .defining_systems ():
971
- composite_systems .append (DynamicalSystem (f * g ))
971
+ composite_systems .append (DynamicalSystem (f * g ))
972
972
return DynamicalSemigroup (composite_systems )
973
973
974
974
def __pow__ (self , n ):
@@ -982,7 +982,7 @@ def __pow__(self, n):
982
982
983
983
OUTPUT: :class:`DynamicalSemigroup`
984
984
985
- EXAMPLES:
985
+ EXAMPLES::
986
986
987
987
sage: A.<x> = AffineSpace(QQ, 1)
988
988
sage: f = DynamicalSystem(x^2, A)
@@ -1200,12 +1200,13 @@ def __eq__(self, other):
1200
1200
"""
1201
1201
if isinstance (other , DynamicalSemigroup ):
1202
1202
if any (ds .degree () == 1 for ds in self .defining_systems ()) or \
1203
- any (ds .degree () == 1 for ds in other .defining_systems ()):
1203
+ any (ds .degree () == 1 for ds in other .defining_systems ()):
1204
1204
raise NotImplementedError ("cannot compare dynamical semigroups with at least one generator of degree 1" )
1205
1205
return all (ds in other .defining_systems () for ds in self .defining_systems ()) and \
1206
1206
all (ds in self .defining_systems () for ds in other .defining_systems ())
1207
1207
return False
1208
1208
1209
+
1209
1210
class DynamicalSemigroup_projective (DynamicalSemigroup ):
1210
1211
r"""
1211
1212
A dynamical semigroup defined by a multiple dynamical systems on projective space.
@@ -1248,7 +1249,7 @@ def __classcall_private__(cls, ds_data):
1248
1249
raise ValueError (str (ds_datum ) + " does not define a 'DynamicalSystem_projective' object" )
1249
1250
else :
1250
1251
if isinstance (ds_data , DynamicalSystem_projective ):
1251
- systems .append (ds_data )
1252
+ systems .append (ds_data )
1252
1253
else :
1253
1254
try :
1254
1255
systems .append (DynamicalSystem_projective (ds_data ))
@@ -1327,12 +1328,15 @@ def dehomogenize(self, n):
1327
1328
new_systems .append (new_system )
1328
1329
return DynamicalSemigroup_affine (new_systems )
1329
1330
1331
+
1330
1332
class DynamicalSemigroup_projective_field (DynamicalSemigroup_projective ):
1331
1333
pass
1332
1334
1335
+
1333
1336
class DynamicalSemigroup_projective_finite_field (DynamicalSemigroup_projective_field ):
1334
1337
pass
1335
1338
1339
+
1336
1340
class DynamicalSemigroup_affine (DynamicalSemigroup ):
1337
1341
r"""
1338
1342
A dynamical semigroup defined by multiple dynamical systems on affine space.
@@ -1374,7 +1378,7 @@ def __classcall_private__(cls, ds_data):
1374
1378
raise ValueError (str (ds_datum ) + " does not define a 'DynamicalSystem_affine' object" )
1375
1379
else :
1376
1380
if isinstance (ds_data , DynamicalSystem_affine ):
1377
- systems .append (ds_data )
1381
+ systems .append (ds_data )
1378
1382
else :
1379
1383
try :
1380
1384
systems .append (DynamicalSystem_affine (ds_data ))
@@ -1435,12 +1439,15 @@ def homogenize(self, n):
1435
1439
new_systems .append (ds .homogenize (n ))
1436
1440
return DynamicalSemigroup_projective (new_systems )
1437
1441
1442
+
1438
1443
class DynamicalSemigroup_affine_field (DynamicalSemigroup_affine ):
1439
1444
pass
1440
1445
1446
+
1441
1447
class DynamicalSemigroup_affine_finite_field (DynamicalSemigroup_affine_field ):
1442
1448
pass
1443
1449
1450
+
1444
1451
def _standardize_domains_of_ (systems ):
1445
1452
r"""
1446
1453
Coerces dynamical systems to the same domain and have the same generators.
@@ -1509,7 +1516,7 @@ def _standardize_domains_of_(systems):
1509
1516
1510
1517
for i in range (len (systems )):
1511
1518
if systems [i ].base_ring () != biggest_ring :
1512
- systems [i ] = systems [i ].change_ring (biggest_ring )
1519
+ systems [i ] = systems [i ].change_ring (biggest_ring )
1513
1520
1514
1521
domain = systems [0 ].domain ()
1515
1522
@@ -1531,4 +1538,4 @@ def _standardize_domains_of_(systems):
1531
1538
new_polys .append (poly .subs (sub_dict ))
1532
1539
systems [i ] = DynamicalSystem (new_polys , domain )
1533
1540
1534
- return systems
1541
+ return systems
0 commit comments