# Use of / operator when defining a function

Hello. I need a clarification on the behaviour of fractions. More precisely, I don't understand the behaviour of the / operator when used inside a def().

I noticed that / finds the integer part of the fraction when used inside a def:

def sumA():
a=randint(2,10)
b=randint(2,10)
c=randint(3,10)
d=randint(4,10)
return [a,b,c,d,a/b + c/d]


Then sumA() the following result:

[8, 3, 9, 8, 3]


That is: 8/3 + 9/8 = 3. How can I make a/b + c/d work like a sum of fractions inside this function?

Oddly enough, the behaviour is different when generating random numbers a and b and adding 1/a + 1/b.

def sumB():
a=randint(2,10)
b=randint(2,10)
return [a,b,1/a + 1/b]


This function adds the fractions in the correct way. The result of sumB() is

[5, 9, 14/45]


Finally, I noticed that writing a1/b + c1/d instead of a/b + c/d makes everything work like fractions:

    def sumC():
a=randint(2,10)
b=randint(2,10)
c=randint(3,10)
d=randint(4,10)
return [a,b,c,d,a*1/b + c*1/d]


The result of sumC() is

 [6, 7, 5, 6, 71/42]

edit retag close merge delete

Sort by ยป oldest newest most voted

This is because randint returns a Python int and not a Sage Integer, and the division of two Python ints leads to an int:

sage: type(randint(2,10))
<type 'int'>

sage: int(5) / int(3)
1


When you write 1/a, since the 1 is a Sage integer, then the coercion makes the division happen in the set od Sage integers, this explains why you got a rational number:

sage: type(1)
<type 'sage.rings.integer.Integer'>

sage: get_coercion_model().common_parent(1,int(3))
Integer Ring


If you want to get random Sage integers, you can either convert the int into Sage integers:

sage: a = ZZ(randint(2,10))
sage: a
5
sage: type(a)
<type 'sage.rings.integer.Integer'>


Or, you can ask Sage to produce a random integer:

sage: a = ZZ.random_element(2,11)
sage: a
9
sage: type(a)
<type 'sage.rings.integer.Integer'>


Note that i replaced the 10 by 11, since in the random_element of Sage, the right bound is excluded, while it is not with the randint function.

more

Thank you so much!

( 2018-10-12 02:59:00 -0600 )edit