差分

ナビゲーションに移動 検索に移動

累乗

2,212 バイト追加, 2020年8月4日 (火) 05:55
ページの作成:「'''累乗'''(るいじょう、英語:repeated multiplication)とは、冪乗(べきじょう)の指数部が1以上の自然数なものをい…」
'''累乗'''(るいじょう、[[英語]]:repeated multiplication)とは、[[冪乗]](べきじょう)の[[指数]]部が1以上の[[自然数]]なものをいう。

ほとんどの[[プログラミング言語]]には[[冪乗]]を計算する[[関数]]は標準搭載されているが、累乗を計算する関数はないことが多く、累乗の計算は冪乗の結果を[[整数]]に[[キャスト]]することで得るようになっていることが多い。

<source lang="csharp">
// 冪乗関数はこんな感じ
double Math.Pow(double x, double y);

// 累乗は結果をキャストすることで得るようになっていることが多い。
int r = (int)Math.Pow(3,11);
</source>

ただし[[冪乗]]の計算は自然数以外も扱える汎用性の高さの代償として非常に計算量が多いため、累乗しか使わないのであれば自前で簡単な関数を実装した方が高速な場合が多い。

<source lang="csharp">
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

public class Program
{
public static void Main(string[] args)
{
var switcher = BenchmarkRunner.Run<Program>();
}

// 冪乗の結果をキャストする
[Benchmark]
[Arguments(3, 11)]
public int PowA(int x, uint exponent)
{
return (int)Math.Pow(x, exponent);
}

// 累乗:教科書どおりの力技
[Benchmark]
[Arguments(3,11)]
public int PowB(int x, uint exponent)
{
int r = 1;
for (int n = 0; n < exponent; n++)
{
r = r * x;
}
return r;
}

// 累乗:アルゴリズム最適化
[Benchmark]
[Arguments(3, 11)]
public int PowC(int x, uint exponent)
{
int ret = 1;
while (exponent != 0)
{
if ((exponent & 1) == 1)
{// 奇数
ret *= x;
}
x *= x;
exponent >>= 1;
}
return ret;
}
}
</source>

案内メニュー