Releases: sagemath/sage
4.4.4
4.4.3
4.4.2
4.4.1
4.4
4.3.5
4.3.4
4.3.3
4.3.2
Release Tour
Sage 4.3.2 was released on Feb 6, 2010 (changelog), 126 tickets (PRs) merged, 41 contributors.
Major features
- much improved interface to Singular which makes using any Singular function much more efficient and easy (cf. Libraries section below)
Libraries
- much improved interface to Singular which makes using any Singular function much more efficient and easy #7939
sage: P.<x,y,z> = QQ[];
sage: A = Matrix(ZZ,[[1,1,0],[0,1,1]])
sage: toric_ideal = sage.libs.singular.ff.toric__lib.toric_ideal # we load the function
sage: toric_ideal(A,"du") # the integer matrix does not tell us which ring we want
Traceback (most recent call last)
...
ValueError: Could not detect ring.
sage: toric_ideal(A,"du",ring=P) # so we try again
[x*z - y]
Geometry
- a major refactoring of the Polyhedron class fixed many bugs, added new functionality, and created a cleaner structure that should make future improvements much easier.
Full Changelog: 4.3.1...4.3.2
4.3.1
Release Tour
Sage 4.3.1 was released on Jan 20, 2010 (changelog), 193 tickets (PRs) merged, 55 contributors.
Major features
- Substantial work towards a complete SPARC Solaris 10 port. This is due to the hard work of David Kirkby. The relevant tickets include #6595, #7067, #7138, #7162, #7387, #7505, #7781, #7815, #7817, #7849
- We're moving closer towards a FreeBSD port, thanks to the work of Peter Jeremy at ticket #7825.
Algebra
- Chinese Remainder Theorem for polynomials #7595 (Robert Miller) -- An implementation of the Chinese Remainder Theorem is needed for general descents on elliptic curves. Here are some examples for polynomial rings:
sage: K.<a> = NumberField(x^3 - 7)
sage: R.<y> = K[]
sage: f = y^2 + 3
sage: g = y^3 - 5
sage: CRT(1,3,f,g)
-3/26*y^4 + 5/26*y^3 + 15/26*y + 53/26
sage: CRT(1,a,f,g)
(-3/52*a + 3/52)*y^4 + (5/52*a - 5/52)*y^3 + (15/52*a - 15/52)*y + 27/52*a + 25/52
This also works for any number of moduli:
sage: K.<a> = NumberField(x^3 - 7)
sage: R.<x> = K[]
sage: CRT([], [])
0
sage: CRT([a], [x])
a
sage: f = x^2 + 3
sage: g = x^3 - 5
sage: h = x^5 + x^2 - 9
sage: k = CRT([1, a, 3], [f, g, h]); k
(127/26988*a - 5807/386828)*x^9 + (45/8996*a - 33677/1160484)*x^8 + (2/173*a - 6/173)*x^7 + (133/6747*a - 5373/96707)*x^6 + (-6/2249*a + 18584/290121)*x^5 + (-277/8996*a + 38847/386828)*x^4 + (-135/4498*a + 42673/193414)*x^3 + (-1005/8996*a + 470245/1160484)*x^2 + (-1215/8996*a + 141165/386828)*x + 621/8996*a + 836445/386828
sage: k.mod(f)
1
sage: k.mod(g)
a
sage: k.mod(h)
3
Basic arithmetic
- Implement
conjugate()
forRealDoubleElement
#7834 (Dag Sverre Seljebotn) --- New methodconjugate()
in the classRealDoubleElement
of the modulesage/rings/real_double.pyx
for returning the complex conjugate of a real number. This is consistent withconjugate()
methods inZZ
andRR
. For example,
sage: ZZ(5).conjugate()
5
sage: RR(5).conjugate()
5.00000000000000
sage: RDF(5).conjugate()
5.0
- Improvements to complex arithmetic-geometric mean for real and complex double fields #7739 (Robert Bradshaw, John Cremona) --- Adds an
algorithm
option to the methodagm()
for complex numbers. The values ofalgorithm
be can:- "pari" --- Call the agm function from the Pari library.
- "optimal" --- Use the AGM sequence such that at each stage
(a,b)
is replaced by(a_1,b_1) = ((a+b)/2,\pm\sqrt{ab})
where the sign is chosen so that|a_1-b_1| \le |a_1+b_1|
, or equivalently\Re(b_1/a_1)\ge0
. The resulting limit is maximal among all possible values. - "principal" --- Use the AGM sequence such that at each stage
(a,b)
is replaced by(a_1,b_1) = ((a+b)/2,\pm\sqrt{ab})
where the sign is chosen so that\Re(b_1/a_1)\ge0
(the so-called principal branch of the square root). The following examples illustrate that the returned value depends on the algorithm parameter:
sage: a = CDF(-0.95, -0.65)
sage: b = CDF(0.683, 0.747)
sage: a.agm(b, algorithm="optimal")
-0.371591652352 + 0.319894660207*I
sage: a.agm(b, algorithm="principal")
0.338175462986 - 0.0135326969565*I
sage: a.agm(b, algorithm="pari")
0.080689185076 + 0.239036532686*I
The same thing for multiprecision real and complex numbers has also been implemented #7719 and will be in the next release.
- New decorator
coerce_binop
#383 (Robert Bradshaw) --- The new decroatorcoerce_binop
can be applied to methods to ensure the arguments have the same parent. For example
@coerce_binop
def quo_rem(self, other):
...
will guarantee that self
and other
have the same parent before this method is called.
Combinatorics
- Weyl group optimizations #7754 (Nicolas M. Thiéry) --- Three major improvements that indirectly also improve efficiency of most Weyl group routines:
- Faster hash method calling the hash of the underlying matrix (which is set as immutable for that purpose).
- New
__eq__()
method. - Action on the weight lattice realization: optimization of the matrix multiplication. Some operations are now up to 34% faster than previously:
BEFORE
sage: W = WeylGroup(["F", 4])
sage: W.cardinality()
1152
sage: %time list(W);
CPU times: user 10.51 s, sys: 0.05 s, total: 10.56 s
Wall time: 10.56 s
sage: W = WeylGroup(["E", 8])
sage: %time W.long_element();
CPU times: user 1.47 s, sys: 0.00 s, total: 1.47 s
Wall time: 1.47 s
AFTER
sage: W = WeylGroup(["F", 4])
sage: W.cardinality()
1152
sage: %time list(W);
CPU times: user 6.89 s, sys: 0.04 s, total: 6.93 s
Wall time: 6.93 s
sage: W = WeylGroup(["E", 8])
sage: %time W.long_element();
CPU times: user 1.21 s, sys: 0.00 s, total: 1.21 s
Wall time: 1.21 s
- Implement the Gale Ryser theorem #7301 (Nathann Cohen, David Joyner) --- The Gale Ryser theorem asserts that if
p_1, p_2
are two partitions ofn
of respective lengthsk_1, k_2
, then there is a binaryk_1 \times k_2
matrixM
such thatp_1
is the vector of row sums andp_2
is the vector of column sums ofM
, if and only ifp_2
dominatesp_1
. T.S. Michael helped a great deal with the refereeing process. Here are some examples:
sage: from sage.combinat.integer_vector import gale_ryser_theorem
sage: p1 = [4, 2, 2]
sage: p2 = [3, 3, 1, 1]
sage: gale_ryser_theorem(p1, p2)
[1 1 1 1]
[1 1 0 0]
[1 1 0 0]
sage: p1 = [4, 2, 2, 0]
sage: p2 = [3, 3, 1, 1, 0, 0]
sage: gale_ryser_theorem(p1, p2)
[1 1 1 1 0 0]
[1 1 0 0 0 0]
[1 1 0 0 0 0]
[0 0 0 0 0 0]
- Iwahori Hecke algebras on the T basis #7729 (Daniel Bump, Nicolas M. Thiéry) --- Iwahori Hecke algebras are deformations of the group algebras of Coxeter groups, such as Weyl groups (finite or affine). Here are some examples:
sage: R.<q> = PolynomialRing(QQ)
sage: H = IwahoriHeckeAlgebra("A3", q)
sage: [T1, T2, T3] = H.algebra_generators()
sage: T1 * (T2 + T3) * T1
T1*T2*T1 + (q-1)*T3*T1 + q*T3
- Coxeter groups: more Bruhat and weak order features #7753 (Nicolas M. Thiéry, Daniel Bump) --- Four new methods implementing the Bruhat order for Coxeter groups. The method
bruhat_le()
for Bruhat comparison:
sage: W = WeylGroup(["A", 3])
sage: u = W.from_reduced_word([1, 2, 1])
sage: v = W.from_reduced_word([1, 2, 3, 2, 1])
sage: u.bruhat_le(u)
True
sage: u.bruhat_le(v)
True
sage: v.bruhat_le(u)
False
sage: v.bruhat_le(v)
True
sage: s = W.simple_reflections()
sage: s[1].bruhat_le(W.one())
False
The method weak_le()
for comparison in weak order:
sage: W = WeylGroup(["A", 3])
sage: u = W.from_reduced_word([1, 2])
sage: v = W.from_reduced_word([1, 2, 3, 2])
sage: u.weak_le(u)
True
sage: u.weak_le(v)
True
sage: v.weak_le(u)
False
sage: v.weak_le(v)
True
The method bruhat_poset()
returns the Bruhat poset of a Weyl group:
sage: W = WeylGroup(["A", 3])
sage: P = W.bruhat_poset()
sage: u = W.from_reduced_word([3, 1])
sage: v = W.from_reduced_word([3, 2, 1, 2, 3])
sage: P(u) <= P(v)
True
sage: len(P.interval(P(u), P(v)))
10
sage: P.is_join_semilattice()
False
The method weak_poset()
returns the left (resp. right) poset for weak order:
sage: W = WeylGroup(["A", 2])
sage: P = W.weak_poset(); P
Finite poset containing 6 elements
sage: W = WeylGroup(["B", 3])
sage: P = W.weak_poset(side="left")
sage: P.is_join_semilattice(), P.is_meet_semilattice()
(True, True)
- Interval exchange transformations #7145 (Vincent Delecroix) --- New module for manipulating interval exchange transformations and linear involutions. Here, we create an interval exchange transformation:
sage: T = iet.IntervalExchangeTransformation(('a b','b a'),(sqrt(2),1))
sage: print T
Interval exchange transformation of [0, sqrt(2) + 1[ with permutation
a b
b a
It can also be initialized using permutation (group theoretic ones):
sage: p = Permutation([3,2,1])
sage: T = iet.IntervalExchangeTransformation(p, [1/3,2/3,1])
sage: print T
Interval exchange transformation of [0, 2[ with permutation
1 2 3
3 2 1
For the manipulation of permutations of IET, there are special types provided by this module. All of them can be cons...