Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikibooksThe Free Textbook Project
Search

Mathematics with Python and Ruby/Fractions in Python

From Wikibooks, open books for an open world
<Mathematics with Python and Ruby

The official Python documentation for the fractions module ishere.

Writing numbers that aren'tintegers as fractions dates back to the Egyptians and the Babylonians, before the use of decimals. Whenever the denominator is not a power of 10, we still often use fractions, although they may be somewhat hidden:

  1. If we say a man is 5 foot 7 inches, his height in feet is5+712=6712{\displaystyle 5+{\frac {7}{12}}={\frac {67}{12}}} (there are twelve inches to the foot);
  2. When we say it's 8:13 am, we mean that exactly8+1360=49360{\displaystyle 8+{\frac {13}{60}}={\frac {493}{60}}} hours (493 minutes) have passed since midnight.
  3. When Romeo complains that he has waited more than three quarters of an hour for Juliet, he is expressing the duration of his anticipation as a fraction...
  4. Probabilities are often given as fractions (usually Egyptian fractions), as in "I have a one in ten million chance of winning the lottery", or "the odds are 5 to 1".
  5. Statistics may also be quoted as fractions: "5 out of every 6 people wear jumpers".

The equation 0.2+0.5=0.7 can be written15+12=710{\displaystyle {\frac {1}{5}}+{\frac {1}{2}}={\frac {7}{10}}}, but the equation12+13=56{\displaystyle {\frac {1}{2}}+{\frac {1}{3}}={\frac {5}{6}}} can't be written exactly using decimal numbers.Python gives the result of 1/2+1/3 as 0.8333333333333333; despite all the digits, this is not the exact answer.

For exact calculations with fractions, Python has afractions module. To use the scripts in this chapter, start with the line:

fromfractionsimport*

This will import everything from the fractions module.

Obtaining a fraction

[edit |edit source]

To enter the fractionnd{\displaystyle {\frac {n}{d}}} inPython, useFraction(n,d), remembering to import it from thefractions module:

fromfractionsimport*a=Fraction(24,10)print(a)# 12/5

We find that Python automatically simplified the fraction2410{\displaystyle {\frac {24}{10}}} when it was instantiated.

If you enter 0 as the denominator, the fraction won't be created, and an error message will occur. We can't divide a number by 0.

Once we have calculated a fraction, we can get itsnumerator anddenominator:

fromfractionsimport*a=Fraction(24,10)print(a.numerator)print(a.denominator)

Of course, the numerator of2410{\displaystyle {\frac {24}{10}}} is not 24, once it has been simplified.

To get the value of the fraction (its numerator divided by its denominator), we can convert it to a 'float' - this refers to how computers typically store numbers other than integers (as 'floating point' numbers):

fromfractionsimport*a=Fraction(24,10)print(float(a))

We can also convert a real number to a fraction, but the result may be surprising, if the number is one that can't be represented exactly in binary:

fromfractionsimport*a=Fraction.from_float(1.2)print(a)

Instead of65{\displaystyle {\frac {6}{5}}}, we get the fraction54043195528445954503599627370496{\displaystyle {\frac {5404319552844595}{4503599627370496}}}. This is because65{\displaystyle {\frac {6}{5}}} can't be stored precisely in binary, just as13{\displaystyle {\frac {1}{3}}} can't be written exactly as a decimal. In this case, we can get a better result by going straight from the decimal to the fraction, without the computer converting it to binary:

fromfractionsimport*a=Fraction('1.2')print(a)

Operations

[edit |edit source]

Operations on fractions are written as for other numbers, but the result is generally a fraction.

Unary Operations

[edit |edit source]

Negation

[edit |edit source]

To negate a fraction, precede it with the- sign. For example:

fromfractionsimport*a=Fraction(2,-3)print(-a)

Inversion

[edit |edit source]

To find the inverse of a fraction, divide 1 by it:

fromfractionsimport*a=Fraction(5,4)print(1/a)

Addition

[edit |edit source]

The sum of two fractions is a fraction:

fromfractionsimport*a=Fraction(34,21)b=Fraction(21,13)print(a+b)

Subtraction

[edit |edit source]

The difference of two fractions is a fraction:

fromfractionsimport*a=Fraction(34,21)b=Fraction(21,13)print(a-b)

Multiplication

[edit |edit source]

The product of two fractions is a fraction:

fromfractionsimport*a=Fraction(34,21)b=Fraction(21,13)print(a*b)

Division

[edit |edit source]

The quotient of two fractions is a fraction (so long as the second is not zero):

fromfractionsimport*a=Fraction(34,21)b=Fraction(21,13)print(a/b)

Theremainder (ormodulo) can also be found for fractions. The result is a fraction:

fromfractionsimport*a=Fraction(32,7)b=Fraction(7,2)print(a%b)

Power

[edit |edit source]

If the exponent is an integer, the power of a fraction is a fraction:

fromfractionsimport*a=Fraction(3,2)print(a**12)print(a**(-1))

But if the exponent is a real number, the power of a fraction is a real number:

fromfractionsimport*a=Fraction(9,4)print(a**0.5)

Algorithms

[edit |edit source]

Farey reduction

[edit |edit source]

Creating aFarey reduction is easy with Python'sfractions module:

fromfractionsimport*defFarey(a,b):n=a.numerator+b.numeratord=a.denominator+b.denominatorreturnFraction(n,d)a=Fraction(3,4)b=Fraction(1,13)print(Farey(a,b))

This can be used make aStern-Brocot tree; that may not clarify much, but it has mathematical uses.

Egyptian fractions

[edit |edit source]

AnEgyptian fraction is made of a series of inverse integers; the Egyptians had a reputation for not using numerators. Any fraction can be written as a sum of Egyptian fractions, and we can useFibonacci's algorithm to find such a sum for any fraction. In thePython example below, the algorithm produces a list of fractions, all with numerator 1, which add up to the given fractionf. Sincef may be greater than 1, we start the list with an integer:

fromfractionsimport*frommathimportceildefegypt(f):e=int(f)f-=eparts=[e]while(f.numerator>1):e=Fraction(1,int(ceil(1/f)))parts.append(e)f-=eparts.append(f)returnpartsa=Fraction(21,13)print(egypt(a))# [1, Fraction(1, 2), Fraction(1, 9), Fraction(1, 234)]print(sum(egypt(a))# 21/13 (confirming that these fractions add up to the original value)

Some explanation of the code above: the denominator of each Egyptian fraction should be an integer, and greater than the inverse of the fractionf, so that the algorithm converges. One solution would be to round the inverse down to an integer (withint) and add 1. But if the inverse off is an integer, adding 1 would lead to an infinite series. So we use theceil function, to round up to an integer. Therefore:

  1. We had to import this function from themath module.
  2. The result ofceil(1/f) is a real number, not an integer, so we can't use it directly in a fraction (Python gives an error). We convert it into an integer usingint.

Finally, we have to add the last Egyptian fraction to the list, to complete the series.

Running the script above, we find that1+12+19+1234=2113{\displaystyle 1+{\frac {1}{2}}+{\frac {1}{9}}+{\frac {1}{234}}={\frac {21}{13}}}.

Retrieved from "https://en.wikibooks.org/w/index.php?title=Mathematics_with_Python_and_Ruby/Fractions_in_Python&oldid=4300507"
Category:

[8]ページ先頭

©2009-2025 Movatter.jp