Pythonによる商と余りの計算
Pythonの割り算に関する関数をご紹介します。
Pythonの標準機能による商と余りの計算
演算子による商と余りの計算
演算子、/,//.%を使い、割り算の答えを計算します。
- #1 演算子による商と余りの計算
- xp = 17;xm = -17
- y = 3
- quotient, remainder = (xp // y, xp % y)
- print('{} / {} ------'.format(xp,y))
- print('商:', quotient)
- print('余り:', remainder)
- print('{} / {} ------'.format(xm,y))
- quotient, remainder = (xm // y, xm % y)
- print('商:', quotient)
- print('余り:', remainder)
17 / 3------ 商: 5 余り: 2 -17 / 3------ 商: -6 余り: 1
- 4行目で商と余りを同時に計算するために、xp // yと xp % yをタプルで計算し、前者をquotient(商), remainder(余り)とします。
- 割られる数がマイナス、割る数がプラスの場合には、商が数値の軸の左側に切り捨てられます。
- 余りは、割る数-商×割られる数 で計算します。
divmod関数による商と余りの計算
Pythonの組み込み関数であるdivmod関数を使うと、#1と同じ計算をすることができます。
- #2 divmod関数による商と余りの計算
- print('divmod({},{})------'.format(xp,y))
- print(divmod(xp, y))
- quotient, remainder = divmod(xp, y)
- print('商:', quotient)
- print('余り:', remainder)
- print('divmod({},{})------'.format(xm,y))
- print(divmod(xm, y))
- quotient, remainder = divmod(xm, y)
- print('商:', quotient)
- print('余り:', remainder)
divmod(17,3)------ (5, 2) 商: 5 余り: 2 divmod(-17,3)------ (-6, 1) 商: -6 余り: 1
mathモジュールにも余りを求めるためにfmod関数があるようですが、Pythonの組み込み関数に昇格したようで、使用は薦めないとのことです。
NumPyモジュール、SymPyモジュールによる商と余りの計算
Numpyの配列
Numpyモジュールのndarray配列を定義すると、配列ごとにまとめて割り算をすることができます。
- #3 NumPyモジュールによる商と余りの計算
- import numpy as np
- nx=np.array([17,-17,17,-17])
- ny=np.array([3,3,-3,-3])
- print('配列 / 配列',nx/ny)
- print('配列 / 数字',nx/2)
- print('数字 / 配列',6/ny)
- print('divmod関数 ',divmod(nx,ny))
配列 / 配列 [ 5.66666667 -5.66666667 -5.66666667 5.66666667] 配列 / 数字 [ 8.5 -8.5 8.5 -8.5] 数字 / 配列 [ 2. 2. -2. -2.] divmod関数 (array([ 5, -6, -6, 5], dtype=int32), array([ 2, 1, -1, -2], dtype=int32))
- 3行目、4行目で定義した4つの要素を持つndarray形式同士を5行目にように割り算をすると、対応する要素同士の割り算の結果を配列で返します。この機能をブロードキャスト機能といいます。
- 6行目にように、配列をスカラー(通常の数字)である2で割り算をすると、配列のそれぞれの要素を割り算した結果を配列で返します。また、7行目はその逆です。
- 8行目のようにdivmod関数を使っても1のような配列同士の計算をすることができます。
NumPyモジュールの関数による商と余りの計算
NumPy関数を使うと効率的に商と余りの計算をすることができます。
- #4 NumPyモジュールによる商と余りの計算
- import numpy as np
- nx=np.array([17,-17,17,-17])
- ny=np.array([3,3,-3,-3])
- print('----true division----')
- print('divide :',np.divide(nx,ny))
- print('true_divide :',np.true_divide(nx, ny))
- print('----floored division----')
- print('floor_divide:',np.floor_divide(nx,ny))
- print('mod :',np.mod(nx,ny))
- print('remainder :',np.remainder(nx,ny))
- print('divmod :',np.divmod(nx,ny))
- print('----truncated division----')
- print('trunc/divide:',np.trunc(np.divide(nx,ny)))
- print('fmod :',np.fmod(nx,ny))
----true division---- divide : [ 5.66666667 -5.66666667 -5.66666667 5.66666667] true_divide : [ 5.66666667 -5.66666667 -5.66666667 5.66666667] ----floored division---- floor_divide: [ 5 -6 -6 5] mod : [ 2 1 -1 -2] remainder : [ 2 1 -1 -2] divmod : (array([ 5, -6, -6, 5], dtype=int32), array([ 2, 1, -1, -2], dtype=int32)) ----truncated division---- trunc/divide: [ 5. -5. -5. 5.] fmod : [ 2 -2 2 -2]
- 5行目以下はdivide関数、true_divide関数を使って、割り切れない場合は小数点表示をする方法です。このような計算方法をtrue divisionといいます。
- 8行目以下はfloor_divide関数で商を、mod、関数またはremainder関数で余りを計算する方法です。また、divmood関数を使うと、商と余りを同時に計算することができます。商がマイナスの場合、マイナスの場合#3のようにマイナス無限大方向(round towards negative infinity)に切り捨てられます。このような方法を、Floored divisionといいます。
- 13行目以下はfmod関数を使い、0の方向(round towards zero)に丸めたときの余りを計算する方法です。ところがこれに対応して商を計算する関数が見当たりません。仕方がないのでdivide関数にtrunc関数を適用します。trunc関数は小数点以下を2とは逆に丸めます。このような方法をTruncated Divisionといいます。truncateは先端を切り捨てるという意味合いで、trunc関数はここからきているものと思われます。
SymPyモジュールに余りの計算
SymPyモジュールには、数値の割り算に関する関数はMod関数しかないようです。SymPyの特徴として、他のモジュールと名前の重複を避けるために1文字目を大文字にすることが多くあります。
- #4 SymPyモジュールによる余りの計算
- import sympy
- sympy.var('sx sy')
- smod=sympy.Mod(sx,sy)
- print(' 17 / 3の余り',smod.subs({sx:17,sy:3}))
- print('-17 / 3の余り',smod.subs({sx:-17,sy:3}))
17 / 3の余り 2 -17 / 3の余り 1
NumPyモジュールとは異なり、商がマイナスの場合にはTruncated Divisionになります。