First time here? Check out the FAQ!

Ask Your Question
1

How to reduce a list of fractions

asked 3 years ago

Jerry Caveney gravatar image

updated 3 years ago

I have a list of integers. I want to divide (n+1) by n. I can do this with no problem, but I can't get the resulting fractions in reduced form. My list has 50 items, but I'll only do a list of 5 here to avoid spamming.

sage: a = [6198089008491993412800, 3099044504245996706400, 2066029669497331137600, 2324283378184497529800, 1239617801698398682560]

sage: c = [(n + 1)/n for n in a]

sage: print (c)

[6198089008491993412801/6198089008491993412800, 3099044504245996706401/3099044504245996706400, 2066029669497331137601/2066029669497331137600, 2324283378184497529801/2324283378184497529800, 1239617801698398682561/1239617801698398682560]

I don't know why Sage doesn't automatically reduce these fractions, but since it doesn't, I've tried multiplying by 1 and using reduce() and simplify(), and have searched everywhere I could think of for an answer, but nothing works. I apologize in advance for asking such a rudimentary question.

Preview: (hide)

Comments

1

n+1 is coprime with n => these fractions are reduced

FrédéricC gravatar imageFrédéricC ( 3 years ago )

Thank you! I didn't pay attention to the output of Sage. I'm trying to divide each term in the list by the term before it, but that's not what I asked for in Sage. Alas, I can't figure out how to ask for what I want. I tried using a(n) and a(n+1) and also creating the list L, but I couldn't get either of those to produce what I'm looking for.

(The result I am looking for is [1/2, 2/3, 9/8, 8/15]. )

Jerry Caveney gravatar imageJerry Caveney ( 3 years ago )

This is a python question. Learn python first ?

FrédéricC gravatar imageFrédéricC ( 3 years ago )

a[0] will give 6198089008491993412801/6198089008491993412800, for example. for n in range(len(a)-1): ...

John Palmieri gravatar imageJohn Palmieri ( 3 years ago )

Thank you, FrédéricC. I went to Python, which I have been studying, slowly, and (of course) with some help from the Stack Overflow forum, figured out to do this in Python.

Jerry Caveney gravatar imageJerry Caveney ( 3 years ago )

2 Answers

Sort by » oldest newest most voted
3

answered 3 years ago

slelievre gravatar image

updated 3 years ago

Use square brackets to take the term of some index in a list.

So a[n + 1] / a[n] instead of a(n + 1) / a(n).

sage: a = [6198089008491993412800,
....:     3099044504245996706400,
....:     2066029669497331137600,
....:     2324283378184497529800,
....:     1239617801698398682560]
sage: c = [a[n + 1] / a[n] for n in range(len(a) - 1)]
sage: c
[1/2, 2/3, 9/8, 8/15]

Added after I saw your answer using zip:

Another solution with zip would be:

sage: c = [x / y for x, y in zip(a[1:], a[:-1])]

See also the pairwise recipe in the itertools documentation, also available via the more-itertools package, and, starting with Python 3.10, directly from itertools:

Preview: (hide)
link

Comments

Thank you! (I added my answer before I saw that you had answered.)

Jerry Caveney gravatar imageJerry Caveney ( 3 years ago )

Thanks also for the Sage method using zip. Just noticed now that you had added that to your answer.

Jerry Caveney gravatar imageJerry Caveney ( 3 years ago )

You can accept an answer by clicking the "accept" button (with a check mark) next to it. This will mark your question as solved in the list of questions.

slelievre gravatar imageslelievre ( 3 years ago )

Forgot about that. Done. Thank you.

Jerry Caveney gravatar imageJerry Caveney ( 3 years ago )
1

answered 3 years ago

Jerry Caveney gravatar image

updated 3 years ago

Note: I added this answer before I saw that FrédéricC had provided an answer using Sage, which is perfect. I have not deleted my answer, since I think it might help other beginners like me understand Python in addition to Sage.

Another solution is to use Python:

import fractions

a = [insert list, deleting last item]

b =  [insert list deleting first item]

for x, y in zip(b, a):
    print(fractions.Fraction(x, y))
Preview: (hide)
link

Comments

To display blocks of code or error messages in Ask Sage, skip a line above and below, and do one of the following (all give the same result):

  • indent all code lines with 4 spaces
  • select all code lines and click the "code" button (the icon with '101 010')
  • select all code lines and hit ctrl-K

For instance, typing

If we define `f` by

    def f(x, y, z):
        return x * y * z

then `f(2, 3, 5)` returns `30` but `f(2*3*5)` gives:

    TypeError: f() takes exactly 3 arguments (1 given)

produces:

If we define f by

def f(x, y, z):
    return x * y * z

then f(2, 3, 5) returns 30 but f(2*3*5) gives:

TypeError: f() takes exactly 3 arguments (1 given)

You can edit your question and answer to do that.

slelievre gravatar imageslelievre ( 3 years ago )

I've tried to edit all my mistakes (though I'm not sure, should Sage output be treated as code? I'm guessing no). If mistakes still remain, please let me know and I'll correct them. Thanks again.

Jerry Caveney gravatar imageJerry Caveney ( 3 years ago )

Thanks for editing! One way to deal with the input and output is to start input lines with the Sage prompt and include output lines in the code block, without prompt (as in my answer).

slelievre gravatar imageslelievre ( 3 years ago )

Corrected, and once more thanks. If you see anything else that should be fixed, please let me know. I've learned a lot from your (and others') responses to this question!

Jerry Caveney gravatar imageJerry Caveney ( 3 years ago )

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 3 years ago

Seen: 558 times

Last updated: Aug 18 '21