Pythonによる商と余りの計算

Pythonの割り算に関する関数をご紹介します。

Pythonの標準機能による商と余りの計算

演算子による商と余りの計算

演算子、/,//.%を使い、割り算の答えを計算します。

  1. #1 演算子による商と余りの計算
  2. xp = 17;xm = -17
  3. y = 3
  4. quotient, remainder = (xp // y, xp % y)
  5. print('{} / {} ------'.format(xp,y))
  6. print('商:', quotient)
  7. print('余り:', remainder)
  8. print('{} / {} ------'.format(xm,y))
  9. quotient, remainder = (xm // y, xm % y)
  10. print('商:', quotient)
  11. print('余り:', remainder)

17 / 3------
商: 5
余り: 2
-17 / 3------
商: -6
余り: 1

  1. 4行目で商と余りを同時に計算するために、xp // yと xp % yをタプルで計算し、前者をquotient(商), remainder(余り)とします。
  2. 割られる数がマイナス、割る数がプラスの場合には、商が数値の軸の左側に切り捨てられます。
  3. 余りは、割る数-商×割られる数 で計算します。

divmod関数による商と余りの計算

Pythonの組み込み関数であるdivmod関数を使うと、#1と同じ計算をすることができます。

  1. #2 divmod関数による商と余りの計算
  2. print('divmod({},{})------'.format(xp,y))
  3. print(divmod(xp, y))
  4. quotient, remainder = divmod(xp, y)
  5. print('商:', quotient)
  6. print('余り:', remainder)
  7. print('divmod({},{})------'.format(xm,y))
  8. print(divmod(xm, y))
  9. quotient, remainder = divmod(xm, y)
  10. print('商:', quotient)
  11. print('余り:', remainder)

divmod(17,3)------
(5, 2)
商: 5
余り: 2
divmod(-17,3)------
(-6, 1)
商: -6
余り: 1

mathモジュールにも余りを求めるためにfmod関数があるようですが、Pythonの組み込み関数に昇格したようで、使用は薦めないとのことです。

NumPyモジュール、SymPyモジュールによる商と余りの計算

Numpyの配列

Numpyモジュールのndarray配列を定義すると、配列ごとにまとめて割り算をすることができます。

  1. #3 NumPyモジュールによる商と余りの計算
  2. import numpy as np
  3. nx=np.array([17,-17,17,-17])
  4. ny=np.array([3,3,-3,-3])
  5. print('配列 / 配列',nx/ny)
  6. print('配列 / 数字',nx/2)
  7. print('数字 / 配列',6/ny)
  8. 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))

  1. 3行目、4行目で定義した4つの要素を持つndarray形式同士を5行目にように割り算をすると、対応する要素同士の割り算の結果を配列で返します。この機能をブロードキャスト機能といいます。
  2. 6行目にように、配列をスカラー(通常の数字)である2で割り算をすると、配列のそれぞれの要素を割り算した結果を配列で返します。また、7行目はその逆です。
  3. 8行目のようにdivmod関数を使っても1のような配列同士の計算をすることができます。

NumPyモジュールの関数による商と余りの計算

NumPy関数を使うと効率的に商と余りの計算をすることができます。

  1. #4 NumPyモジュールによる商と余りの計算
  2. import numpy as np
  3. nx=np.array([17,-17,17,-17])
  4. ny=np.array([3,3,-3,-3])
  5. print('----true division----')
  6. print('divide :',np.divide(nx,ny))
  7. print('true_divide :',np.true_divide(nx, ny))
  8. print('----floored division----')
  9. print('floor_divide:',np.floor_divide(nx,ny))
  10. print('mod :',np.mod(nx,ny))
  11. print('remainder :',np.remainder(nx,ny))
  12. print('divmod :',np.divmod(nx,ny))
  13. print('----truncated division----')
  14. print('trunc/divide:',np.trunc(np.divide(nx,ny)))
  15. 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]

  1. 5行目以下はdivide関数、true_divide関数を使って、割り切れない場合は小数点表示をする方法です。このような計算方法をtrue divisionといいます。
  2. 8行目以下はfloor_divide関数で商を、mod、関数またはremainder関数で余りを計算する方法です。また、divmood関数を使うと、商と余りを同時に計算することができます。商がマイナスの場合、マイナスの場合#3のようにマイナス無限大方向(round towards negative infinity)に切り捨てられます。このような方法を、Floored divisionといいます。
  3. 13行目以下はfmod関数を使い、0の方向(round towards zero)に丸めたときの余りを計算する方法です。ところがこれに対応して商を計算する関数が見当たりません。仕方がないのでdivide関数にtrunc関数を適用します。trunc関数は小数点以下を2とは逆に丸めます。このような方法をTruncated Divisionといいます。truncateは先端を切り捨てるという意味合いで、trunc関数はここからきているものと思われます。

SymPyモジュールに余りの計算

SymPyモジュールには、数値の割り算に関する関数はMod関数しかないようです。SymPyの特徴として、他のモジュールと名前の重複を避けるために1文字目を大文字にすることが多くあります。

  1. #4 SymPyモジュールによる余りの計算
  2. import sympy
  3. sympy.var('sx sy')
  4. smod=sympy.Mod(sx,sy)
  5. print(' 17 / 3の余り',smod.subs({sx:17,sy:3}))
  6. print('-17 / 3の余り',smod.subs({sx:-17,sy:3}))

17 / 3の余り 2
-17 / 3の余り 1

NumPyモジュールとは異なり、商がマイナスの場合にはTruncated Divisionになります。