On Wed, Feb 9, 2011 at 10:46 PM, daly <d...@axiom-developer.org> wrote: > On Wed, 2011-02-09 at 22:18 -0800, rjf wrote: >> You say, >> > gcd(2/1,4) returns 1 "for simplicity" (!), because 2/1 is a rational. >> > This is shockingly silly. >> >> I don't know exactly how this came up, but if 2/1 is in a different >> domain (rational) >> from 2, (integer), then gcd should probably be 1, since any non- >> zero >> rational number divides any other, and one commonly uses the positive >> "unit" 1 for >> such a case. You could argue that since you can coerce 2/1, you >> should. >> >> That's sometimes OK, but not always. >> >> Really, the issue is much broader. for example, do you also want to >> treat the complex number >> 1+0*i the same as 1? do you want to treat the floating point number >> 1.0 the same as 1? >> >> What about 1X1 matrices? >> >> Is 1^0 the same as 1^0.0 or 1.0^0 or 1.0^0.0? Do you perhaps wish >> to consider/dismiss >> the existence of number systems with signed zeros (IEEE floating-point >> standard) on the >> grounds that -0 = +0, [true, for numerical comparison] and therefore >> there should be >> only a single zero? >> >> While I don't know the exact formulation of this GCD problem, the >> issue of >> implicit coercion is one of the troubling sore spots in a system >> design, and should not >> be decided by counting up casual +1 votes. >> >> I think the Axiom people might have thought more about it than others. >> > > It is a question of domains. In Axiom you can specify the domains. > > 2/1 is a Fraction(Integer) aka rational > 4 is an Integer > (2/1)::Integer => 2 where 2 is an Integer. > 4::Fraction(Integer) is a Fraction(Integer) > > So there are several cases: > gcd((2/1),4::Fraction(Integer)) => 1 of type Fraction(Integer) > gcd((2/1)::Integer,4)) => 2 of type PositiveInteger > gcd(2/1,4) => 1 of type Fraction(Integer) > gcd(2,4) => 2 of type PositiveInteger > gcd(2,4::Fraction(Integer)) => 1 of type Fraction(Integer) > > Tim Daly
Thanks. The above is _precisely_ what Sage currently does: sage: a = gcd(2/1,QQ(4)); print a, type(a) 1 <type 'sage.rings.rational.Rational'> sage: a = gcd(ZZ(2/1), 4); print a, type(a) 2 <type 'sage.rings.integer.Integer'> sage: a = gcd(2/1, 4); print a, type(a) 1 <type 'sage.rings.rational.Rational'> sage: a = gcd(2, 4); print a, type(a) 2 <type 'sage.rings.integer.Integer'> sage: a = gcd(2, QQ(4)); print a, type(a) 1 <type 'sage.rings.rational.Rational'> I personally see no *harm* in allowing gcd(a,b) to be a different choice of generator for the ideal (a,b), which is all that the OP is requesting. PARI does this, and it is definitely very useful there. Always returning 1 (or 0) in the rationals isn't very useful. -- William -- To post to this group, send an email to sage-devel@googlegroups.com To unsubscribe from this group, send an email to sage-devel+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-devel URL: http://www.sagemath.org