MPIR ライブラリを使用するのはこれが初めてです。bigintegers でいくつかの計算を行う必要があります。実際には、これらの数値の最大値は 2048 ビットです。実装しなければならない最初のタスクは、入力された 10 進数値の合計ビット数を見つけることです。これには、対数の使用が必要です。
MPIR ライブラリで、これは与えられた基数の合計桁数を与える単純な関数であり、MPIR では利用できない対数を見つける代わりになることがわかりました。
size_t mpz_sizeinbase (mpz t op, int base)
指定された基数の桁数で測定された op のサイズを返します。base は 2 ~ 36 の範囲で指定できます。op の符号は無視され、絶対値のみが使用されます。結果は、正確または 1 が大きすぎます。base が 2 の累乗の場合、結果は常に正確になります。op がゼロの場合、戻り値は常に 1 です。この関数を使用して、op を文字列に変換するときに必要なスペースを決定できます。適切な割り当て量は、通常、mpz_sizeinbase によって返される値よりも 2 大きく、マイナス記号用に 1 つ、ヌル ターミネータ用に 1 つ追加されます。mpz_sizeinbase(op,2) を使用して、1 から数えて op の最上位 1 ビットを見つけることができることに注意してください。 (0 から始まるビット関数とは異なり、セクションを参照してください
私は自分のプログラムでこの関数を次のように使用しようとしています:
#include < cstdio>
#include < stdlib.h>
#include < gmpxx.h>
#include < iostream>
#include <mpirxx.h>
#include <math.h>
#include <windows.h>
void main()
{
mpz_t opt;
size_t nob;
opt=200;
nob= mpz_sizeinbase(opt, 10);
cout << nob<<"\n";
}
答えは 3 のはずです。
しかし、コンパイル中に次のエラーが発生します。
エラー 13 エラー C2440: '=': 'int' から 'mpz_t' に変換できません logicaloperations.cpp 27 1 logicaloperations
エラー 14 エラー C2664: '__gmpz_sizeinbase': パラメーター 1 を 'int' から 'mpz_srcptr' に変換できません logicaloperations.cpp 28 1 logicaloperations **
これはテスト用です。実際のコードでは、次のような値になります。
mpz_t opt= 111111111111111111111111111111111111111111111111999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
この関数のパラメーターを正しく使用する方法を教えてください。
例で十分でしょう。