Mathematics with Python and Ruby/Whole numbers in Ruby
A peculiarity of the integers is that any one of them possesses a predecessor and a successor. Although it is very easy to compute them (subtract or add one to an integer), Ruby has methods coined pred and succ to handle them!
How to get an integer in Ruby
[edit | edit source]From a string
[edit | edit source]This script
a=7
puts(a)
yields exactly the same result than
a="7"
puts(a)
at least at first sight. But if one tries to add 2,
a=7
puts(a+2)
yields 9 as expected, but
a="7"
puts(a+2)
yields an error message, as one can not add a number with a string.
So a string representing an integer number has to be converted into a number with the to_i method (to integer). Thus
a="7"
b=a.to_i
puts(b+2)
yields 9 this time.
An other way to get an integer number from a string is to count its letters. Which is made with its length property:
t="Supercalifragilisticexpialidocious"
n=t.length
puts(n)
From a real number
[edit | edit source]A real number too has a to_i method which converts it to an integer. This is sometimes useful because for Ruby is not considered as an integer number:
a=Math.sqrt(100)
puts(a.integer?)
Ruby answers false because the number has been computed as 10.0 and not 10. So
a=Math.sqrt(100).to_i
puts(a.integer?)
yields the expected true. But
a=3.9999999
b=a.to_i
puts(b)
may not have the expected result: to_i uses a truncature instead of an approximation. Actually, floor has the same effect:
a=3.9999999
b=a.floor
puts(b)
On the converse, a real number has also a ceil method:
a=3.9999999
b=a.ceil
puts(b)
But now an other problem arouses:
a=3.0000001
b=a.ceil
puts(b)
Maybe 4 was not the expected answer!
Finally the best method to get an integer approximation is round:
a=3.9999999
b=a.round
puts(b)
From an other integer
[edit | edit source]So, to get the successor of an integer, one asks to it to tell its successor, with its method succ:
puts(7.succ)
tells that 7+1=8 (you bet!), whereas
puts(7.pred)
shows that 7-1=6. But contrary to Peano's axiom number 7, zero has a predecessor (which is -1) because for Ruby the integers are rational integers and not only natural ones. Then, any integer has an additive inverse, which one can obtain by just preceding its name by a minus sign:
a=-5
puts(-a)
This yields 5 because the additive inverse of -5 is 5.
Primality
[edit | edit source]To know if an integer is prime requires an other module called mathn, which offers a primality test prime? (a boolean):
require 'mathn'
a=2**32+1
puts(a.prime?)
This shows at a glance that 4 294 967 297 is not prime , shame on Fermat (he has excuses, he didnt't own a Ruby console!)!
Operations
[edit | edit source]Addition, subtraction and multiplication
[edit | edit source]For Ruby, the arithmetic operations are denoted by +, - et * without surprise. These operations work also on negative integers:
a=5
b=-8
puts(a+b)
puts(a-b)
puts(a*b)
Division
[edit | edit source]Quotient
[edit | edit source]Unless otherwise specified, the division denoted by the slash operator is the integer one. To specify otherwise one needs to write one of the operands as a float, with a period:
num=3
den=2
q=num/den
puts(q)
yields 1 instead of 1.5 because the integer quotient is 1 (with a remainder), while any if the following variants yields 1.5:
puts(3.0/2)
puts(3/2.0)
puts(3.0/2.0)
puts(3.to_f/2)
To compute the exact value of a non integer quotient, one needs to use fractions.
Remainder
[edit | edit source]Sometimes (often?) the quotient is not as important as the remainder (RSA cryptography for example, or even the hours, that are counted modulo 12). The remainder is given by the modulo operator denoted as %:
a=13
b=8
r=a%b
puts(r)
It is then quite possible to compute in modular arithmetic with Ruby.
Divisors
[edit | edit source]In Ruby, the gcd is an infix operation:
a=13572468
b=12345678
g=a.gcd(b)
puts(g)
Of course, a.gcd(b) and b.gcd(a) yield the same result.
Likewise, the lcm of two integers a and b can be computed as a.lcm(b).
An integer which has no divisor (except 1 and itself) is a prime number. Ruby can test the primality of an (not to big) integer:
require 'prime'
n=2012
puts(n.prime?)
puts(n.prime_division)
The above example shows that Ruby can even find the prime divisors of an integer!
Exponentiation
[edit | edit source]In Ruby, the exponentiation operator is denoted with the same asterisk than the multiplication, but written twice:
a=4
b=2
puts(a**b)
puts(b**a)
This shows that .
Remarks:
- If the exponent is negative, the result of the exponentiation is a fraction.
- If the exponent is a float, the result is a float even if it is actually an integer (like in 256**0.25).
Priority
[edit | edit source]In Ruby like in algebra, the computings are made in this order:
- First, the parentheses;
- then the functions (like the exponentiation for example);
" then only the multiplications and divisions;
- At last, the additions and subtractions.
Thus
puts(2+3*5)
displays 17 and not 25, because in this case the operations are not computed from left to right, but the multiplication first.