やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

組込ライブラリ(Integer、Bignum、Fixnum)

 Numericのサブクラスのうち整数。

成果物

情報源

クラス 概要
Numeric 数の抽象クラス
Integer 整数クラス。
Bignum Integerの具象クラス(Ruby2.4からはIntegerのエイリアス
Fixnum Integerの具象クラス(Ruby2.4からはIntegerのエイリアス
Float 浮動少数クラス。IEEE754。
Rational 有理数クラス。分子と分母。
Complex 複素数クラス。整数と虚数

 整数はInteger有理数Rationalを使うのが良さそう。

 BignumFixnumFloatC言語などと連携するときにのみ使う。

Integer

sqrt

 平方根を返す。

p Integer.sqrt(0)        # => 0
p Integer.sqrt(1)        # => 1
#p Integer.sqrt(-1) #=> Numerical argument is out of domain - "isqrt" (Math::DomainError)
p Integer.sqrt(2)        # => 1  近似値は1.41421356...(一夜一夜に人見頃)
p Integer.sqrt(3)        # => 1  近似値は1.7320508...(人並みにおごれや)
p Integer.sqrt(4)        # => 2
p Integer.sqrt(5)        # => 2  近似値は2.2360679...(富士山麓オウム鳴く)
p Integer.sqrt(24)       # => 4
p Integer.sqrt(25)       # => 5
p Integer.sqrt(10**400) == 10**200 # => true

 他言語ならばMathクラスに実装されているであろう関数。

 平方根は負でない整数を返す。有理数では返さない。

**, pow

 べき乗。

p 2 ** 3  #=> 8
p 2.pow 3 #=> 8

gcd

 最大公約数を返す。

2.gcd(2)                    # => 2
4.gcd(6)                    # => 2
4.gcd(8)                    # => 4
3.gcd(7)                    # => 1
3.gcd(-7)                   # => 1
((1<<31)-1).gcd((1<<61)-1)  # => 1

lcm

 最小公倍数を返す。

p 2.lcm(2)                    # => 2
p 4.lcm(6)                    # => 12
p 4.lcm(8)                    # => 8
p 3.lcm(7)                    # => 21
p 3.lcm(-7)                   # => 21
p ((1<<31)-1).lcm((1<<61)-1)  # => 4951760154835678088235319297

gcdlcm

 最大公約数と最小公倍数の配列を返す。

p 2.gcdlcm(2)                    # => [2,2]
p 4.gcdlcm(6)                    # => [2,12]
p 4.gcdlcm(8)                    # => [4,8]
p 3.gcdlcm(7)                    # => [1,21]
p 3.gcdlcm(-7)                   # => [1,21]
p ((1<<31)-1).gcdlcm((1<<61)-1)  # => [1,4951760154835678088235319297]

所感

 他にも面白いメソッドがいくつもある。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux