この記事では、プログラミング言語で値を2乗する方法を紹介します。
2乗とは?
2乗とは「ある数を2回掛けること」です。
たとえば、3の2乗(3²)は、3 x 3 で 9 になります。
累乗(るいじょう)とは?
同じように「ある数を3回掛けること」を3乗、「ある数を3回掛けること」を4乗といいます。
3の3乗 → 3³ = 3 x 3 x 3 = 27
3の4乗 → 3⁴ = 3 x 3 x 3 x 3 = 81
このように、ある数を繰り返し掛けることを「累乗(るいじょう)」といいます。
累乗は 3² のように、繰り返し掛ける数(3)の右上に、繰り返す回数(2)を小さく書いて表記します。
このとき、右上に小さく書いた数を「指数(しすう)」といいます。
繰り返し掛ける数を「底(てい)」といいます。
![底が「3」で指数が「2」の画像](http://chmod774.com/wp-content/uploads/2023/05/image-6.png)
Xª(Xのa乗)では、Xが底で、aが指数です。
冪乗(べきじょう)とは?
累乗(るいじょう)という呼び名を使うときは、指数が「1以上の自然数」に限られます。
自然数とは「1、2、3…」のように、物を数えるときに使う数です。
-1や1/2や、3.4は自然数ではありません。
累乗(るいじょう)を「1以上の自然数」以外の数にも使えるように発展させたものを「冪乗(べきじょう)」といいます。
たとえば、3⁻²や3⁰は冪乗の例です。
![べき乗と累乗の違い](http://chmod774.com/wp-content/uploads/2023/05/image-7.png)
プログラミングで値を2乗する方法
プログラミングで2乗を計算したいとき、一般的には、次のような書き方ができます。
※言語によって細かい書き方は異なります。詳しくは後述の「【プログラミング言語別】べき乗の書き方」を参照してください。
アスタリスクを2つ書く方法(べき乗演算子)
2乗したい値や変数の後ろに、アスタリスク(*)を2つ書き、その後ろに指数を書きます。
たとえば、3の2乗は次のように書きます。
3**2
「**」は「べき乗演算子」と呼ばれます。
pow(Pow, power)関数を使う方法
ほとんどのプログラミング言語には「pow関数」という、べき乗を計算するための関数が用意されています。
powはpowerの略で、英語で「べき乗」のことです。
pow関数を使うことで、べき乗を簡単に計算できます。
たとえば、Pythonで3の2乗を計算するには、次のように書きます。
pow(3, 2)
Pythonでは、pow関数を pow(底, 指数) のように呼び出すことでべき乗を計算できます。
【プログラミング言語別】べき乗の書き方
ここからは、プログラミング言語別に「べき乗の書き方」を紹介します。
ほとんどのプログラミング言語で「べき乗演算子(**)」か「pow関数」が使えます。
ただし、書き方はそれぞれの言語で異なる場合があるため注意してください。
C言語のべき乗
C言語でべき乗を計算するには、libm(数学ライブラリ)の「pow()関数」を使用します。
pow()関数は、第1引数に底(double)を、第2引数に指数(double)を渡すと「べき乗」を計算して返します。
たとえば、3の2乗ならpow(3, 2)です。
以下にサンプルプログラムを掲載します。
#include <math.h>
#include <stdio.h>
int main(void)
{
double x, y, z;
x = 3.0;
y = 2.0;
z = pow(x,y);
printf("%lf の %lf 乗は %lf", x, y, z);
}
/*** 出力
3.000000 の 2.000000 乗は 9.000000
***/
ファイルの先頭で「math.h」というヘッダーファイルをインクルード(include)します。
ここでは結果を出力するために「stdio.h」もインクルードしています。
また、libmを参照できるようにするためにリンクしなければなりません。ファイルをコンパイルするときに「-lmオプション」をつけてコンパイルするだけです。
参考: https://www.ibm.com/docs/ja/i/7.1?topic=ssw_ibm_i_71/rtref/pow.htm
Pythonのべき乗
Pythonのべき乗の計算には、2つの方法があります。
- 「べき乗演算子(power operator)」を使う方法
- 組み込み関数のpow()を使う方法
それぞれ紹介します。
1.【Python】べき乗演算子(**)を使う方法
Pythonでは「べき乗演算子」を使うと、べき乗を簡単に計算できます。
べき乗演算子とは、2つのアスタリスクを使ってべき乗の演算を表現する方法です。
2つのアスタリスク(**)の左側に底を書き、右側に指数を書きます。
たとえば、3の2乗は次のように書きます。
ans = 3 ** 2
print(ans)
# 出力: 9
参考: https://docs.python.org/ja/3/reference/expressions.html#the-power-operator
2. 【Python】組み込み関数pow() を使う方法
Pythonでは組み込み関数のpow()を使って、べき乗を計算することもできます。
※組み込み関数とは、Pythonにもともと組み込まれている関数のことです。外部ライブラリをimportしなくても使える関数です。
Pythonのpow関数は、第1引数に底を与え、第2引数に指数を与えると、べき乗を計算します。
底も指数も数値型(int, float, complexのどれか)でなければいけません。
たとえば、3の2乗は次のように書きます。
ans = pow(3, 2)
print(ans)
# 出力: 9
参考: https://docs.python.org/ja/3/library/functions.html#pow
JavaScriptのべき乗
JavaScriptのべき乗の計算には、2つの方法があります。
- 「べき乗演算子(**)」を使う方法
- Math.pow() 関数を使う方法
それぞれ紹介します。
1.【JavaScript】べき乗演算子(**)を使う方法
JavaScriptでは「べき乗演算子」を使うと、べき乗を簡単に計算できます。
べき乗演算子とは、2つのアスタリスクを使ってべき乗の計算を表現する方法です。
2つのアスタリスク(**)の左側に底を書き、右側に指数を書きます。
たとえば、3の2乗は次のように書きます。
let ans = 3 ** 2;
console.log(ans)
// 出力: 9
参考: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Exponentiation
2.【JavaScript】Math.pow() 関数を使う方法
JavaScriptではMath.pow() 関数を使って、べき乗を計算することもできます。
Math.pow() 関数は、第1引数に底を、第2引数に指数を渡すと、べき乗を計算して返します。
たとえば、3の2乗は次のように書きます。
let ans = Math.pow(3, 2);
console.log(ans);
// 出力: 9
参考: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/pow
Rubyのべき乗
Rubyのべき乗の計算には、2つの方法があります。
- 「べきの乗の算術演算子(**)」を使う方法
- pow() 関数を使う方法
それぞれ紹介します。
1.【Ruby】べき乗の算術演算子(**)を使う方法
Rubyでは「べき乗の算術演算子」を使うと、べき乗を簡単に計算できます。
べき乗の算術演算子とは、2つのアスタリスクを使ってべき乗の演算の演算を表現する方法です。
2つのアスタリスク(**)の左側に底を書き、右側に指数を書きます。
たとえば、3の2乗は次のように書きます。
ans = 3 ** 2
puts ans
// 出力: 9
参考: https://docs.ruby-lang.org/ja/latest/method/Integer/i/=2a=2a.html
2. 【Ruby】Integerクラスのpowメソッドを使う方法
RubyではIntegerクラス(整数クラス)のpowメソッドを使ってべき乗を計算することもできます。
powメソッドの引数には指数を渡します。
たとえば、3の2乗は次のように書きます。
ans = 3.pow(2)
puts ans
PHPのべき乗
PHPのべき乗の計算には、2つの方法があります。
- 「**演算子」を使う方法
- pow() 関数を使う方法
それぞれ紹介します。
1. 【PHP】「**演算子」を使う方法
PHPでは「**演算子」を使うと、べき乗を簡単に計算できます。
算術演算子「**」の左辺に底を、右辺に指数を書きます。
たとえば、3の2乗は次のように書きます。
<?php
$ans = 3 ** 2;
echo $ans
// 出力: 9
?>
参考: https://www.php.net/manual/ja/language.operators.arithmetic.php
2. 【PHP】pow()関数を使う方法
PHPではpow()関数を使っても、べき乗を計算できます。
第1引数に底を、第2引数に指数を渡すと、べき乗を返します。
たとえば、3の2乗は次のように書きます。
<?php
$ans = pow(3, 2);
echo $ans
// 出力: 9
?>
参考: https://www.php.net/manual/ja/function.pow.php
Javaのべき乗
JavaではMathクラスのpowメソッドを使ってべき乗を計算できます。
powメソッドは第1引数に底を、第2引数に指数を受け取り、べき乗を計算して返します。
たとえば、3の2乗は次のように書きます。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
double ans = Math.pow(3, 2);
System.out.println(ans);
// 出力: 9.0
}
}
参考: https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Math.html#pow-double-double-
C#のべき乗
C#では、MathクラスのPowメソッドを使ってべき乗を計算します。
Powメソッドは第1引数に底を、第2引数に指数を受け取り、べき乗を計算して返します。
たとえば、3の2乗は次のように書きます。
using System;
public class Power {
public static void Main(){
double ans = Math.Pow(3, 2);
System.Console.WriteLine(ans);
// 出力: 9
}
}
参考: https://learn.microsoft.com/ja-jp/dotnet/api/system.math.pow?view=net-7.0
エクセル
エクセルでのべき乗の計算には、2つの方法があります。
- 「^演算子」を使う方法
- 「POWER関数」を使う方法
それぞれ紹介します。
1. 「^演算子」を使う方法
エクセルでべき乗を計算するには「^(キャレット)演算子」を使う方法が簡単です。
計算に使うセルをアクティブにして「=」を書いたあと「^演算子」の左側に底を、右側に指数を書くとべき乗を計算できます。
たとえば、3の2乗を計算するには、セルに次のように入力してEnterキーを押します。
A | B | C | |
1 | =3^2 | ||
2 |
2. POWER関数を使う方法
エクセルでべき乗を計算するもう1つの方法は、POWE関数を使用することです。
POWER関数では「POWER(数値, 指数)」の書式で、べき乗を計算できます。
たとえば、3の2乗は次のように、セルに「=POWER(3,2)」と入力してEnterキーを押すと計算できます。
A | B | C | |
1 | =POWER(3,2) | ||
2 |
べき乗の計算方法の違いによる処理速度の差
ここまで紹介してきたように、プログラミング言語によっては複数の方法でべき乗を計算できます。
たとえば、Pythonで3の10乗を計算するには、以下の4つの方法が考えられます。
- (a) べき乗の算術演算子(**)を使う
- (b) 組み込み関数のpowを使う
- (c) 算術演算子(*)を使って3を10回乗算する
- (d) forループを使って3を10回乗算する
これらの計算方法の違いによって、計算速度に違いが出る可能性があります。
それぞれ試してみましょう。
実行環境
実行環境は以下です。
- Python 3.10.7
- macOS Ventura 13.2
- MacBook Air M1 2020
- メモリ8GB
検証用コード
次のようなコードを書いて、実行速度を比較します。
timeitモジュールを使用し、それぞれのメソッドを10000回ずつ実行し、それらの処理時間を平均して、関数の1回あたりの実行速度を比較します。
import timeit
def power_a():
ans = 3 ** 2
def power_b():
ans = pow(3, 10)
def power_c():
ans = 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3
def power_d():
ans = 1
for _ in range(10):
ans *= 3
a = timeit.timeit('power_a()', number=10000, globals=globals())
print(f"power_a {a}")
b = timeit.timeit('power_b()', number=10000, globals=globals())
print(f"power_b {b}")
c = timeit.timeit('power_c()', number=10000, globals=globals())
print(f"power_c {c}")
d = timeit.timeit('power_d()', number=10000, globals=globals())
print(f"power_d {d}")
検証結果
メソッド | 計算方法 | メソッドを1回実行するのにかかった時間 |
power_a | **演算子 | 0.0004089580034 |
power_b | pow関数 | 0.002609332994 |
power_c | 3 * 3 * … * 3 | 0.0004489170096 |
power_d | forループ | 0.002936832985 |
aとcが明らかに早く、ほぼ同じ実行時間でした。
bとdでは、それらより6倍以上遅くなりました。
算術演算子を使った「べき乗」計算が効率的な理由
上記のように算術演算子(**, *)を使った計算が速いのは、pow関数やforループの例では、関数呼び出し(function call)に時間を消費するためです。
disモジュールを使うと、Pythonの内部動作を調べることができます。
>>> from dis import dis
>>> dis('3 ** 2')
1 0 LOAD_CONST 0 (9)
2 RETURN_VALUE
>>> dis('pow(3, 2)')
1 0 LOAD_NAME 0 (pow)
2 LOAD_CONST 0 (3)
4 LOAD_CONST 1 (2)
6 CALL_FUNCTION 2
8 RETURN_VALUE
「3 ** 2」という計算方法では、定数をロードして値を返す(LOAD_CONST, RETURN_VALUE)だけなのに対して、「pow(3, 2)」では、CALL_FUNCTIONという手続きが加えられています。
CALL_FUNCTOINという手続きが加えられています。
参考: https://stackoverflow.com/questions/20969773/exponentials-in-python-xy-vs-math-powx-y
関数を呼び出す手間のために、計算が少し遅くなるのです。
「べき乗の計算方法の違いによる処理速度の差」のまとめ
このように、どの方法でべき乗を計算するかによって、処理速度は異なります。
今回は調査していませんが、Python以外のプログラミング言語でも、計算方法によって処理時間が変わる可能性があります。
1回の計算では気にならない速度差も、繰り返し回数が大きくなるほど大きさ差につながります。
こうした些細な違いを知っておくと、より効率的なプログラムを書けるようになります。
まとめ
この記事では、プログラミングで2乗を計算する方法を紹介しました。
また、Pythonでの計算方法の違いによる処理速度の差についても解説しました。
他の言語でも計算方法によって処理時間に違いがあるかもしれません。ぜひ、ご自身で検証してみてください。新たな発見があって面白いはずです。
コメント