Dear William: I've sent you a patch for improving the rational numbers and integer implementations, more precisely:
-fixing multiplicative_order so that it returns +Infinity instead of raising an exception. - fixing bugs (still present in sage-2.4.2) like sage: a=1/2 sage: a.is_one() True sage: a.multiplicative_order() 1 - improving the documentation of lcm, gcd for rational numbers. (This functions are not standards and their documentation was not clear enough) Have you received it? Just in case, I sent here an updated version, both as a patch (clear text) and as a bundle. best regards Pablo > Hello, > > > > I've released sage-2.4.2. This is just a fairly minimal > > bugfix release, though there are number of important optimizations > > in it. There are probably about 10-15 patches from people > > in my patch inbox that I haven't included yet due to a > > lack of time. Those will be in the next SAGE release, > > which is planned for Sunday: > > http://www.sagemath.org:9002/sage_trac/milestone/sage-2.5 > > > > Here's the high-level changelog for this release: > > > > 2.4.2: > > * r bradshaw: very very fast sagex new implementation of > > graph plotting code. > > * t boothby: added compression of javascript so notebook > > loads more quickly. > > * r miller: optimization to graph automorphism code > > * k minola and m albrecht: build fixes to linbox and > sage_c_lib. > > * y qiang: transitioned dsage to use sqlite; many minor > bugfixes > > * w stein: wrote a MuPAD interface for SAGE. > > * w stein: added restore and reset commands to SAGE, to > (mostly) > > reset the state of SAGE and all interfaces very very > > > quickly without having to quit and restart SAGE. > > * w stein: p-adic L-series (numerous improvements) > > * c witty (referee by r bradshaw): improvements to floating > > point <---> rational conversions. > > Hello, > > I have a compilation failure with gdmodule-0.56.p2 on cygwin: > > Making script relocatable > sage-spkg gdmodule-0.56.p2 2>&1 > gdmodule-0.56.p2 > Machine: > CYGWIN_NT-5.1 SPROCKET2 1.5.19(0.150/4/2) 2006-01-20 13:28 i686 Cygwin > Deleting directories from past builds of previous/current versions of > gdmodule-0.56.p2 > Extracting package /cygdrive/d/sage- 2.4.2/spkg/standard/ > gdmodule-0.56.p2.spkg ... > -rwx------+ 1 test Kein 22331 Jan 10 19:24 /cygdrive/d/sage-2.4.2/spkg/ > standard/gdmodule-0.56.p2.spkg > gdmodule-0.56.p2/ > gdmodule-0.56.p2/_gdmodule.c > gdmodule-0.56.p2 /gd-ref.html > gdmodule-0.56.p2/gd.py > gdmodule-0.56.p2/install_notes.html > gdmodule-0.56.p2/PKG-INFO > gdmodule-0.56.p2/README > gdmodule-0.56.p2/sage/ > gdmodule-0.56.p2/sage/_gdmodule.c > gdmodule-0.56.p2/sage/Setup.py > gdmodule-0.56.p2/sage/Setup.py.cygwin > gdmodule-0.56.p2/SAGE.txt > gdmodule-0.56.p2/SAGE.txt~ > gdmodule-0.56.p2/Setup.py > gdmodule-0.56.p2/Setup.py~ > gdmodule-0.56.p2/spkg-install > gdmodule-0.56.p2/spkg-install~ > Finished extraction > **************************************************** > Host system > uname -a: > CYGWIN_NT-5.1 SPROCKET2 1.5.19(0.150/4/2) 2006-01-20 13:28 i686 Cygwin > **************************************************** > **************************************************** > GCC Version > gcc -v > Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs > Configured with: /gcc/gcc-3.4.4/gcc-3.4.4-1/configure --verbose -- > prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib -- > libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info > --enable-languages=c,ada,c++,d,f77,java,objc --enable-nls --without- > included-gettext --enable-version-specific-runtime-libs --without-x -- > enable-libgcj --disable-java-awt --with-system-zlib --enable- > interpreter --disable-libgcj-debug --enable-threads=posix --enable- > java-gc=boehm --disable-win32-registry --enable-sjlj-exceptions -- > enable-hash-synchronization --enable-libstdcxx-debug : (reconfigured) > Thread model: posix > gcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125) > **************************************************** > WARNING: Missing libiconv Libraries > running build > running build_py > creating build > creating build/lib.cygwin-1.5.19-i686-2.5 > copying gd.py -> build/lib.cygwin-1.5.19-i686-2.5 > running build_ext > building '_gd' extension > creating build/temp.cygwin-1.5.19-i686-2.5 > gcc -fno-strict-aliasing -DNDEBUG -g -O3 -Wall -Wstrict-prototypes - > DHAVE_LIBGD -DHAVE_LIBPNG -DHAVE_LIBZ -DHAVE_LIBFREETYPE - > DHAVE_LIBLIBICONV -I/cygdrive/d/sage-2.4.2/local/include -I/usr/local/ > include -I/usr/include -I/usr/include/X11 -I/usr/X11R6/include -I/ > cygdrive/d/sage-2.4.2/local/include/python2.5 -c _gdmodule.c -o build/ > temp.cygwin-1.5.19-i686-2.5/_gdmodule.o > _gdmodule.c:152: warning: function declaration isn't a prototype > _gdmodule.c:169: warning: function declaration isn't a prototype > gcc -shared -Wl,--enable-auto-image-base build/temp.cygwin-1.5.19- > i686-2.5/_gdmodule.o -L/cygdrive/d/sage-2.4.2/local/lib -L/usr/local/ > lib -L/usr/lib -L/usr/lib/X11 -L/usr/X11R6/lib -L/cygdrive/d/ > sage-2.4.2 /local/lib/python2.5/config -lgd -lpng -lz -lfreetype - > llibiconv -lpython2.5 -o build/lib.cygwin-1.5.19-i686-2.5/_gd.dll > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x1e90): undefined reference to `_FcConfigSubstitute' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x1eab): undefined reference to `_FcConfigSubstitute' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x1eb6): undefined reference to `_FcDefaultSubstitute' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x1ed0): undefined reference to `_FcFontMatch' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x1f82): undefined reference to `_FcPatternBuild' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x1f9e): undefined reference to `_FcPatternDestroy' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x1fc6): undefined reference to `_FcPatternGetString' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x2005): undefined reference to `_FcPatternDestroy' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x2079): undefined reference to `_FcNameParse' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x2095): undefined reference to `_FcPatternDestroy' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x20bd): undefined reference to `_FcPatternGetString' > /cygdrive/d/sage-2.4.2/local/lib/libgd.a(gdft.o):gdft.c:(.text > +0x20e9): undefined reference to `_FcPatternDestroy' > collect2: ld returned 1 exit status > error: command 'gcc' failed with exit status 1 > Failure to build gdmodule > > real 0m2.750s > user 0m1.519s > sys 0m0.477s > sage: An error occured while installing gdmodule-0.56.p2 > Please email William Stein < [EMAIL PROTECTED]> explaining the > problem and send him the relevant part of > of /cygdrive/d/sage-2.4.2/install.log. Don't send the whole thing. > If you want to try to fix the problem, yourself *don't* just cd to > /cygdrive/d/sage-2.4.2/spkg/build/gdmodule-0.56.p2 and type 'make'. > Instead (using bash) type "source local/bin/sage-env" from the > directory > /cygdrive/d/sage-2.4.2 > in order to set all environment variables correctly, then cd to > /cygdrive/d/sage-2.4.2/spkg/build/gdmodule-0.56.p2 > make[1]: *** [installed/gdmodule-0.56.p2] Error 1 > make[1]: Leaving directory `/cygdrive/d/sage-2.4.2/spkg' > > real 22m45.250s > user 28m8.575s > sys 10m3.163s > > The problem has happened in the past (there is a thread regarding this > with the 1.6 release), but I have fontconfig installed (from sources). > Might that be related to "WARNING: Missing libiconv Libraries"? > According to the link failure the missing symbols are not from > libiconv. > > Cheers, > > Michael > > > > > --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to [EMAIL PROTECTED] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/ -~----------~----~----~----~------~----~------~--~---
diff -r 58f0060fc358 -r 3e505971184e sage/ext/cdefs.pxi --- a/sage/ext/cdefs.pxi Sat Mar 31 23:53:27 2007 -0700 +++ b/sage/ext/cdefs.pxi Fri Apr 13 12:29:59 2007 -0300 @@ -47,6 +47,7 @@ cdef extern from "gmp.h": void mpz_ior (mpz_t rop, mpz_t op1, mpz_t op2) void mpz_clear(mpz_t integer) int mpz_cmp(mpz_t op1, mpz_t op2) + int mpz_cmpabs(mpz_t op1, mpz_t op2) int mpz_cmp_si(mpz_t op1, signed long int op2) int mpz_cmp_ui(mpz_t op1, unsigned long int op2) void mpz_divexact (mpz_t q, mpz_t n, mpz_t d) diff -r 58f0060fc358 -r 3e505971184e sage/rings/integer.pyx --- a/sage/rings/integer.pyx Sat Mar 31 23:53:27 2007 -0700 +++ b/sage/rings/integer.pyx Fri Apr 13 12:29:59 2007 -0300 @@ -12,6 +12,7 @@ AUTHORS: -- David Harvey (2006-09-16): attempt to optimise Integer constructor -- Rishikesh (2007-02-25): changed quo_rem so that the rem is positive -- David Harvey, Martin Albrecht, Robert Bradshaw (2007-03-01): optimized Integer constructor and pool + -- Pablo De Napoli (2007-04-01): multiplicative_order should return +infinity for non zero numbers EXAMPLES: Add 2 integers: @@ -1450,8 +1451,7 @@ cdef class Integer(sage.structure.elemen def multiplicative_order(self): r""" - Return the multiplicative order of self, if self is a unit, or raise - \code{ArithmeticError} otherwise. + Return the multiplicative order of self. EXAMPLES: sage: ZZ(1).multiplicative_order() @@ -1459,20 +1459,17 @@ cdef class Integer(sage.structure.elemen sage: ZZ(-1).multiplicative_order() 2 sage: ZZ(0).multiplicative_order() - Traceback (most recent call last): - ... - ArithmeticError: no power of 0 is a unit + +Infinity sage: ZZ(2).multiplicative_order() - Traceback (most recent call last): - ... - ArithmeticError: no power of 2 is a unit - """ - if mpz_cmp_si(self.value, 1) == 0: - return Integer(1) + +Infinity + """ + import sage.rings.infinity + if mpz_cmp_si(self.value, 1) == 0: + return Integer(1) elif mpz_cmp_si(self.value, -1) == 0: - return Integer(2) + return Integer(2) else: - raise ArithmeticError, "no power of %s is a unit"%self + return sage.rings.infinity.infinity def is_squarefree(self): """ diff -r 58f0060fc358 -r 3e505971184e sage/rings/rational.pyx --- a/sage/rings/rational.pyx Sat Mar 31 23:53:27 2007 -0700 +++ b/sage/rings/rational.pyx Fri Apr 13 12:29:59 2007 -0300 @@ -9,6 +9,8 @@ AUTHORS: -- William Stein and Naqi Jaffery (2006-03-06): height, sqrt examples, and improve behavior of sqrt. -- David Harvey (2006-09-15): added nth_root + -- Pablo De Napoli (2007-04-01): corrected the implementations of + multiplicative_order, is_one; optimzed __nonzero__ ; documented: lcm,gcd """ @@ -322,21 +324,61 @@ cdef class Rational(sage.structure.eleme return codomain._coerce_(self) def lcm(self, Rational other): - """ + r""" Return the least common multiple of self and other. - - Our hopefully interesting notion of LCM for rational numbers - is illustrated in the examples below. - - EXAMPLES: + + One way to define this notion is the following: + + Note that each rational positive rational number can be written + as a product of primes with integer (positive or negative) + powers in a unique way. + + Then, the LCM of two rational numbers x,y can be defined by + specifying that the exponent of every prime p in lcm(x,y) + is the maximum of the exponents of p in x, + and the exponent of p in y + (The primes that does not appear in the decomposition of x + or y are considered to have exponent zero). + + This definition is consistent with the definition of the LCM + in the rational integers. Our hopefully interesting notion of LCM + for rational numbers is illustrated in the examples below. + + EXAMPLES: + sage: lcm(2/3,1/5) 2 + + This is consistent with the definition above, since: + 2/3 = 2^1 * 3^{-1}*5^0 + 1/5 = 2^0 * 3^0 *5^{-1} + and hence, + lcm(2/3,1/5)= 2^1*3^0*5^0 = 2 + sage: lcm(2/3,7/5) 14 + + In this example: + 2/3 = 2^1*3^{-1}*5^0 * 7^0 + 7/5 = 2^0*3^0 *5^{-1} * 7^1 + lcm(2/3,7/5) = 2^1*3^0*5^0*7^1 = 14 + sage: lcm(1/3,1/5) 1 + + In this example: + 1/3 = 3^{-1}*5^0 + 1/5 = 3^0 * 5^{-1} + lcm(1/3,1/5)=3^0*5^0=1 + sage: lcm(1/3,1/6) 1/3 + + In this example: + 1/3 = 2^0*3^{-1} + 1/6 = 2^{-1}*3^{-1} + lcm(1/3,1/6)=2^0*3^{-1}=1/3 + """ d = self.denom()*other.denom() self_d = self.numer()*other.denom() @@ -346,19 +388,58 @@ cdef class Rational(sage.structure.eleme def gcd(self, Rational other): """ Return the least common multiple of self and other. - - Our hopefully interesting notion of GCD for rational numbers - is illustrated in the examples below. - - EXAMPLES: + + One way to define this notion is the following: + + Note that each rational positive rational number can be written + as a product of primes with integer (positive or negative) + powers in a unique way. + + Then, the GCD of two rational numbers x,y can be defined by + specifying that the exponent of every prime p in gcd(x,y) is + the minimum of the exponents of p in x, + and the exponent of p in y + (The primes that does not appear in the decomposition of x or y + are considered to have exponent zero). + + This definition is consistent with the definition of the GCD + in the rational integers. Our hopefully interesting notion of GCD + for rational numbers is illustrated in the examples below. + + EXAMPLES: + sage: gcd(2/3,1/5) 1/15 + + This is consistent with the definition above, since: + 2/3 = 2^1 * 3^{-1}*5^0 + 1/5 = 2^0 * 3^0 *5^{-1} + and hence, + gcd(2/3,1/5)= 2^0*3^{-1}*5^{-1} = 1/15 + sage: gcd(2/3,7/5) 1/15 + + In this example: + 2/3 = 2^1*3^{-1}*5^0 * 7^0 + 7/5 = 2^0*3^0 *5^{-1} * 7^1 + gcd(2/3,7/5) = 2^0*3^{-1}*5^{-1}*7^0 = 1/15 + sage: gcd(1/3,1/6) 1/6 + + In this example: + 1/3 = 2^0*3^{-1} + 1/6 = 2^{-1}*3^{-1} + gcd(1/3,1/6)=2^{-1}*3^{-1}=1/6 + sage: gcd(6/7,9/7) 3/7 + + In this example: + 6/7 = 2^1*3^1*7^{-1} + 9/7 = 2^0*3^2*7^{-1} + gcd(6/7,9/7)=2^0*3^1*7^{-1}=3/7 """ d = self.denom()*other.denom() self_d = self.numer()*other.denom() @@ -695,7 +776,8 @@ cdef class Rational(sage.structure.eleme return x def __nonzero__(self): - return not self.numerator().is_zero() + # A rational number is zero iff its numerator is zero. + return bool(mpz_cmp_si(mpq_numref(self.value), 0) != 0) def __abs__(self): cdef Rational x @@ -1018,8 +1100,7 @@ cdef class Rational(sage.structure.eleme def multiplicative_order(self): """ - Return the multiplicative order of self, if self is a unit, or raise - \code{ArithmeticError} otherwise. + Return the multiplicative order of self. EXAMPLES: sage: QQ(1).multiplicative_order() @@ -1027,25 +1108,47 @@ cdef class Rational(sage.structure.eleme sage: QQ('1/-1').multiplicative_order() 2 sage: QQ(0).multiplicative_order() - Traceback (most recent call last): - ... - ArithmeticError: no power of 0 is a unit + +Infinity sage: QQ('2/3').multiplicative_order() - Traceback (most recent call last): - ... - ArithmeticError: no power of 2/3 is a unit - """ - if mpz_cmp_si(mpq_numref(self.value), 1) == 0: + +Infinity + sage: QQ('1/2').multiplicative_order() + +Infinity + """ + import sage.rings.infinity + if self.is_one(): return integer.Integer(1) - elif mpz_cmp_si(mpq_numref(self.value), -1) == 0: + elif bool(mpz_cmpabs(mpq_numref(self.value),mpq_denref(self.value))==0): + # if the numerator and the denominator are equal in absolute value, + # then the rational number is -1 return integer.Integer(2) else: - raise ArithmeticError, "no power of %s is a unit"%self - + return sage.rings.infinity.infinity + def is_one(self): - return bool(mpz_cmp_si(mpq_numref(self.value), 1) == 0) + r""" + Determine if a rational number is one. + + EXAMPLES: + + sage: QQ(1/2).is_one() + False + sage: QQ(4/4).is_one() + True + """ + # A rational number is equal to 1 iff its numerator and denominator are equal + return bool(mpz_cmp(mpq_numref(self.value),mpq_denref(self.value))==0) def is_zero(self): + r"""Test if a rational number is zero + + EXAMPLES: + + sage: QQ(1/2).is_zero() + False + sage: QQ(0/4).is_zero() + True + """ + # A rational number is zero iff its numerator is zero. return bool(mpz_cmp_si(mpq_numref(self.value), 0) == 0) cdef _lshift(self, long int exp):
sage_fixes.bundle
Description: Binary data