2017-03-13 4 views
0

私は基本的に非常に大きな数を含むいくつかの代数式を含むプロジェクトに取り組んでいます。また、標準の演算子(int、long int、long longなど)を使用するだけでは切り取られません。私が現在使用しているコードは次のように書かれた(そして、より大きなプロジェクトの一部である)されていますC++で非常に大きな整数を使って作業する

#include<iostream> 
long int myPow(long int base, long int exponent, long int mod) { 
    long int prod = 1; 

    while (exponent > 0) { 
     if (exponent & 1 == 1) { 
      prod *= base; 
      prod %= mod; 
     } 
     base *= base; 
     base %= mod; 
     exponent /= 2; 
     } 
    return prod; 
} 

int main() { 
    long int a = myPow(2 , 1000, 100007); 
    std::cout << a << std::endl; 
    system("pause"); 
    return 0; 
} 

、私は非常に大きな数を処理するためのGMPを使用することが可能であることを読んだことがあります。残念ながら、私はプログラミングの世界ではむしろ新しいものです。私が理解する限り、GMPはMinGWコンパイラに依存しています。私は現在、Visual Studio 2015を実行しています。

私は別のフォーラムやGoogleを閲覧しましたが、GIF(および/またはMinGW)の設定方法に関する新しいガイド(2014年以降)は見つかりませんでした。これは、リンクが壊れている、存在しないなどの参照を意味します。私は、Windows/Visual Studio(MinGWをインストールしようとしています)を改ざんしようと恐れています。 setup/compiler(標準のVisual Studioコンパイラ - それが何を呼んでいるかわかりません)。

とにかく、誰かが正しい方向に私を指し示すことができたり、いくつかの文献を推薦することができれば、非常に感謝しています。

最後の手段として、Code :: Blocks(標準MinGW ?!)をインストールすることを検討していますが、Visual Studioの現在のセットアップがうまくいきませんか?もう一つの可能​​性は、Ubuntuで仮想マシンを作成し、それにCode :: Blocksを実行することです。とにかく、それはかなり広範に見えると私はVSでWindowsにとどまることを望むだろう - 可能であれば。

+1

次をご覧ください:http://stackoverflow.com/questions/19688442/how-to-install-mpfr-and-gmp-for-c-on-visual-studio –

+0

@RichardCrittenこんにちはRichard。私はこのスレッドをすでに見ました。しかし、この解決策は、「比較的バグのない」バイナリ(引用)に依存しています。また、32ビットシステムしかサポートしていないため、非常に大きな数で作業すると無駄に見えます。とにかく、私は "より良い"解決策を望んでいましたが、あなたの返事に感謝します。 – bgaard

答えて

1

は、次のコードBoost.Multiprecision を見ては、VS 2015上で動作しておいてください。

#include "boost/multiprecision/cpp_int.hpp" 
#include <iostream> 

namespace mp = boost::multiprecision; 

typedef mp::number<mp::cpp_int_backend<4096, 4096, mp::signed_magnitude, mp::unchecked, void> > int4096_t; 

int4096_t myPow(int4096_t base, long int exponent, long int mod) { 
    int4096_t prod = 1; 

    while (exponent > 0) { 
     if (exponent & 1 == 1) { 
      prod *= base; 
      prod %= mod; 
     } 
     base *= base; 
     base %= mod; 
     exponent /= 2; 
    } 
    return prod; 
} 



int main() 
{ 
    int4096_t a = myPow(2, 1000, 100007); 
    std::cout << a << std::endl; 

    int i; 
    std::cin >> i; 
    return 0; 
} 

、版画44850.私は例えばint4096_t整数型(4096ビット長)を定義していますが、定義済みのブーストを使用することができます:: multiprecision :: int1024_tまたは別の適切な型。

+0

これは素晴らしいです!ありがとうございました。他の誰かが興味を持っているなら、あなたはここから始めることができます(彼らのウェブページはあまり直感的ではありません):http://www.boost.org/doc/libs/1_63_0/more/getting_started/windows.html – bgaard

関連する問題