# Listing fractions

Hi, I would like to request help in listing rational numbers. For motivation, the command

[x for x in IntegerRange(1,10)]

outputs the integers from 1 through 9. Is there a similar command for listing out rational numbers a/b with a and b in the range (x1,y1) and (x2,y2), respectively.

For instance, if a is in range (1,3) and b is in (4,6), I want to return

[1/4, 1/5, 1/2, 2/5]

On a related note, how can one impose a gcd(x,y)==1 in the following list?

[(x,y) for x in IntegerRange(1,10) for y in IntegerRange(1,10)]

edit retag close merge delete

Sort by » oldest newest most voted

Either I do not understand your specification or your example is incomplete. The one-liner :

sage: [v for v in sorted(set([t/u for t in (1..3) for u in (4..6)]))]
[1/6, 1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 3/4]


returns elements not in your answer, but I do not understand why you exclude them.

On a related note, how can one impose a gcd(x,y)==1 in the following list?

Sage does that automatically :

sage: 2/4
1/2


To ensure unicity, use a set ; the result may be easier to read by using its sorted version (see the above one-liner).

HTH,

more

Tom complement previous answers, you might by interested by the method:

sage: QQ.range_by_height?

more

A first trap is the following one, i somehow guess, that this was the reason for the question:

sage: for a in range(1,3):
....:     for b in range(4,6):
....:         print a, b, a/b
....:
1 4 0
1 5 0
2 4 0
2 5 0


The reason for this is the fact that range builds a list of python integers, so the division is the plain division of integers, it delivers also an integer as result, this is the floor of the mathematically considered fraction $a/b$. To see the types:

sage: [ (a, type(a)) for a in range(1,3) ]
[(1, <type 'int'>), (2, <type 'int'>)]


So in order to get rational numbers, we have to tell sage to use sage specific objects. To get a "better list" suited for an immediate division, we may use instead one of the following solutions:

• convert each a in range(1,3) to a sage integer, or to a sage rational number, i.e. use [ ZZ(a) for a in range(1,3) ] and/or [ QQ(a) for a in range(1,3) ] ,
• use the sage interval [1..2] ,
• use the sage range IntegerRange(1,3) .

And here are the lines of code doing the job the one or the other way:

sage: [ ZZ(a)/ZZ(b) for a in range(1,3) for b in range(4,6) ]
[1/4, 1/5, 1/2, 2/5]
sage: [ QQ(a)/QQ(b) for a in range(1,3) for b in range(4,6) ]
[1/4, 1/5, 1/2, 2/5]
sage: [ a/b for a in [1..2] for b in [4,5] ]
[1/4, 1/5, 1/2, 2/5]
sage: [ ZZ(a)/ZZ(b) for a in IntegerRange(1,3) for b in IntegerRange(4,6) ]
[1/4, 1/5, 1/2, 2/5]
sage: [ QQ(a)/QQ(b) for a in IntegerRange(1,3) for b in IntegerRange(4,6) ]
[1/4, 1/5, 1/2, 2/5]


The related answer. List comprehension also accepts a boolean condition (with and and or if more complicated). In our case:

[(x,y) for x in IntegerRange(1,10) for y in IntegerRange(1,10) if gcd(x,y)==1]


One may construct the last list also by generating all fractions, then passing to the list of the set of the list:

sage: L1 = [ x/y for x in IntegerRange(1,10) for y in IntegerRange(1,10) if gcd(x,y)==1]
sage: L2 = [ x/y for x in IntegerRange(1,10) for y in IntegerRange(1,10) ]
sage: L1.sort()
sage: L2 = list(set(L2))
sage: L2.sort()
sage: L1 == L2
True
sage: len(L1), len(L2)
(55, 55)


The one (or the other way) will list - after a small adaptation to two different ranges - all irreducible (resp. all possibly reducible) fractions with numerator and denominator in given ranges. (If the ranges start from the one, the two lists coincide.)

more