2016-04-01 5 views
0

モジュロと組み合わせたパワー操作を実行したい。このpow()関数を実数で実行するのに問題があります。実数のモジュロでpow()を計算するには?

これは整数のため正常に動作します:しかし、これは実数でエラーを返します

pow(2,6000,400) = 176 

pow(1.4142, 6000, 400) 

私もmath.pow()機能を試してみましたが、それはどちらか 仕事をしません。どうすればこの数字を実数で扱うことができますか?

+0

どのようなプログラミング言語をお使いですか? –

+0

VBとPythonだけを使用しています – Amy

答えて

2

python関数pow()は、2つまたは3つの引数を受け入れます。あなたのケースでは、pow(x,y,z)xyになり、モジュロzが結果に適用されます。しかしdocumentationは、明示的である:

2番目の引数が負の場合、3番目の引数が を省略しなければなりません。 zが存在する場合、xとyは整数型でなければならず、yは でなければなりません。

ので:引数が要件に準拠しているため

  • あなたの最初の呼び出しは、正常に動作します。 pow(2,6000)が巨大であるにもかかわらず、整数のmodular exponentiationのプロパティを使用すると、モジュロ演算の結合結果はオーバーフローなしで簡単に計算できます。

  • 第1引数が整数ではないため、2番目の呼び出しはエラーで失敗します。回避策はmoduloが実数に定義されているため、操作をpow(1.4142,6000) % 400に分解することです。
    残念ながら、pow(1.4142,6000)が大きすぎてオーバーフローエラーが発生します。これは、無制限の範囲であるPython整数とは逆に、C浮動小数点エンコーディングの範囲でreal numbers are limitedであるためです。

P.S:私はVB's pow()だけで2つの引数を受け付けますので、それは、PythonとないVBのことだと仮定しました。

編集:ここではこの問題を回避するためのヒント

技術的には、浮動小数点数が無制限の精度の数学的な実数が、合理的な数ではないという事実を利用する少しの回避策。私たちは、その後、分子と分母を利用すると、膨大な数をマスターする整数演算を使用することができます。

n=pow(14142,6000)   # take the first argument multiplied by a 10 exponent to make it an integer 
d=pow(10000,6000)   # keep track of this 10 exponent 
i=n//d     # integer division to compute the integral value 
r=n-d*i     # remainder of the integer division 
precision=6    # precision 
f=r*pow(10,precision)//d # keep the 6 most significant digits 
result=(i%400)+(f/pow(10,precision)) 

結果は6桁目に271.048181です。私はあなたに、それほど工芸的ではない方法でこれを実行する関数の書き方を演習としてお任せします。

+0

これは非常に役立ちます!!!!ありがとうございました!!! :)これで実験します。 – Amy

+0

Christophe、「271.04」という戻り値がどれほど正確だと感じるかもしれませんか?それは非常に正確でしょうか? – Amy

+0

[エラー伝搬のルール](http://www.fas.harvard.edu/~scysys/nsta/error_propagation.pdf)によると、正確な値は270.62と271.48であるように+/- 0.4243です – Christophe

関連する問題