2012-05-03 6 views
3

任意のバイト数と1バイトの間でモジュロ演算を行うCで実装されたアルゴリズムを作成する必要があります。 2のべき乗の場合バイト配列と8ビット整数を持つモジュロアルゴリズム:8bit = bytes%8bit

typedef struct{ 
    u_int8_t * data; 
    u_int16_t length; 
}UBigInt; 
u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){ 

} 

&(B-1)を使用することができますが、どのような2のべき乗以外について:これを参照してください?

私は1つの方法は実現: - UBigIntDivisionWithUInt8とUBigIntMultiplicationWithUInt8とUBigIntSubtractionWithUBigIntを使用するために必要となるのb *(A/B)

。これを行うより効率的な方法がありますか?

ありがとうございます。

u_int8_t UBigIntModuloWithUInt8(UBigInt a,u_int8_t b){ 
    if (!(b & (b - 1))) 
     return a.data[a.length - 1] & b - 1; // For powers of two this can be done 
    // Wasn't a power of two. 
    u_int16_t result = 0; // Prevents overflow in calculations 
    for(int x = 0; x < a.length; x++) { 
     result *= (256 % b); 
     result %= b; 
     result += a.data[x] % b; 
     result %= b; 
    } 
    return result; 
} 
+0

「a」は任意のバイト数です。 bについて何か言いたいことがあればどうしますか?それは一定ですか?もしそうなら、どんな価値がありますか? – violet313

+0

私は 'b'は任意の8ビット(符号なし?)の整数だと思います。 –

+0

bは1-255であってもよい。私は58のためにそれを実装する必要がありますが、より多くの場合があります。 58のために特別に最適化されたソリューションがある場合、それは良いでしょうが、私はそれを実装する必要があります。 –

答えて

4

あなたはホーナー法のバリエーションを使用することができます。

これは私が今持っている実装です。
この式でバイトごとに処理します。
a % b = ((a // 256) % b) * (256 % b) + (a % 256) % bここで、x // yは丸め除算(通常のC整数除算)です。これが働く理由は、モジュロbが同値関係であるということです。
これはO(length)アルゴリズム、またはO(log(a))です。
例スニペット(未テスト、私のCのスキルが錆びている):

u_int16_t result = 0; // Just in case, to prevent overflow 
for(i = 0, i<a.length; i++) { 
    result *= (256 % b); 
    result %= b; 
    result += (a[i] % b); 
    result %= b; 
} 

いくつかの正当化: a = (a // 256) * 256 + (a % 256)、したがって、 a % b = ((a // 256) * 256) % b + ((a % 256) % b)。しかし、a % 256 = a[n-1]およびa // 256 = a[0 .. n-2]。 Hornerのルールに似た方法でアクションを逆にすると、提示されたスニペットが得られます。

+0

これはどのように動作するのか分かりませんが、それは単なるテストのようです。それを実装し、あなたにテストして戻します。ありがとう。 –

+0

Genius!できます。それはとても華麗です。 :-) –

+0

ありがとう、私はこのコードでPython(任意のサイズのintのネイティブサポートを持っています)でテストしました:http://codepad.org/Eo00RNEJサイクリングの2分後にエラーを出すように見えなかったので、私はそれは大丈夫だと思う;)私は0で除算をカバーしていないことに注意してください。 –