Soluciones al problema de desbordamiento del módulo de multiplicación de enteros largos

// Todavía se mueve ...

 

Recientemente, vi una tabla de multiplicación rápida y sentí curiosidad. La miré detenidamente y era muy similar al método de escritura rápida, pero no era una multiplicación "rápida", pero podía resolver el problema de desbordamiento de la multiplicación.

Como todos sabemos, en C ++, cuando se multiplican dos enteros largos y en módulo, el valor intermedio obtenido durante la multiplicación puede exceder el rango de long long, resultando en un desbordamiento de datos y resultados impredecibles. En los concursos de programación, esta situación ocurre a menudo y necesitamos dominar el método para enfrentarla. Entonces, ¿tenemos una solución a este problema? La respuesta es sí.

En primer lugar, podemos considerar un enfoque: la multiplicación bit a bit. Para dos números decimales a, b, podemos multiplicar b con uno por uno, y en cada acarreo, un * 10 módulo p. Por supuesto, el módulo tomado es consistente con el módulo tomado por la multiplicación de dos números. De esta forma, el resultado de cada paso es el producto del dígito actual de by el valor de a. Para cada multiplicación, se suman los resultados y se toma el módulo. De esta forma, se puede obtener a * b% p.

Considere el enfoque más cercano a la computadora: trate dos números como binarios, en este momento cada bit de b solo puede ser 0 o 1, nuevamente reduciendo el número de multiplicaciones, y la complejidad de tiempo del algoritmo es O (log b) . El autor no tiene claros los pros y los contras de este procesamiento y multiplicación directa, pero es muy eficaz para tratar datos que pueden desbordarse.

Publica el código:

long long q_mul(long long a,long long b,long long p)
{
    long long sum = 0;
    while(b)
    {
        if(b&1)
            sum = (sum+a)%p;
        a=a<<1;
        a%=p;
        b=b>>1;
    }
    return sum;
}

Si tiene alguna pregunta o corrección, los mensajes privados son bienvenidos.

Supongo que te gusta

Origin blog.csdn.net/qq_39586345/article/details/90523938
Recomendado
Clasificación