为什么权力函数给出负值?

时间:2018-02-01 11:54:35

标签: c# long-integer integer-overflow

目前我正在实施RSA算法。以下功能用于RSA中我们需要的功率。

private long power2(long x, long y, long n)
{
    long temp = 1;
    while (y > 0)
    {
        var z = y & 1;
        if (z == 1)
        {
            temp = ((temp % n) * (x % n)) % n;
        }

        x = ((x % n) * (x % n)) % n;

        y = y >> 1;
    }
    return temp;
}

这里n是9个字符长(从6开始)。 如果我增加n的值(从9开始),则此函数为某些x和y值给出负值。我不知道为什么会这样。长期可以包含值高达9223372036854775807并且在我的幂函数中,乘法无法超出此值。

如果我想花费更长时间(10-15个字符)然后我正在使用,我必须使用哪种数据类型。我尝试过Decimal和double,但它有与上面相同的问题(给出负值)。

2 个答案:

答案 0 :(得分:3)

这是由so-called overflow发生的。

Here is an article解释了为什么会这样。

您可能希望to use BigInteger结构来自System.Numerics

答案 1 :(得分:3)

您的解决方案仍然可以超越长值

你将x%n的结果(可以是10个字符长)与相同的值相乘,这得到的结果很可能超过2 ^ 64(在应用最后一个模数之前,模数之前的结果应该是适合长变量)

考虑使用BigInteger