132 votos

Exponenciación modular a mano ( abmodcabmodc )

¿Cómo puedo calcular eficientemente abmodcabmodc :

  • En bb es enorme, por ejemplo 5844325mod215844325mod21 ?
  • En bb es inferior a cc pero aún así sería mucho trabajo multiplicar aa por sí mismo bb veces, por ejemplo 569mod101569mod101 ?
  • En (a,c)1(a,c)1 por ejemplo 6103mod146103mod14 ?

¿Existen otros trucos para evaluar exponentes en aritmética modular?


Esto se pide en un esfuerzo por reducir los duplicados, véase aquí y aquí .

3 votos

Pequeño teorema de fermat

3 votos

Puede resultar laborioso cuando cc es enorme, pero bb ser enorme no debería ser un problema.

76voto

Robert Christie Puntos 7323

Wikipágina sobre aritmética modular no está mal.

  • En bb es enorme, y aa y cc son coprimos, Teorema de Euler se aplica: ababmodϕ(c)modcababmodϕ(c)modc Para el ejemplo que nos ocupa, ϕ(21)=ϕ(3)×ϕ(7)=2×6=12ϕ(21)=ϕ(3)×ϕ(7)=2×6=12 . 844325mod12=5, so 55=5×2525×42=8017mod21844325mod12=5, so 55=5×2525×42=8017mod21 .

  • En aa y cc son coprimos, pero 0<b<ϕ(c)0<b<ϕ(c) La cuadratura repetida (o el uso de otras composiciones de potencias) es la forma más rápida de hacerlo (manualmente): 545×535×2419(mod101)194(192)2582(43)2184931(mod101)314(312)2(961)2522270478(mod101)5695×54×((54)4)45×19×785×19×(23)19×(14)26637(mod101)

  • En a y c no son coprimos, sea g=gcd(a,c) . Sea a=g×d y c=g×f entonces, suponiendo b>1 : abmodc=gb×dbmod(g×f)=(g×(gb1dbmodf))modc En el ejemplo dado, gcd(6,14)=2 . Así que 2102×3103mod7 utilizando el teorema de Euler, con ϕ(7)=6 y 1020mod6 , 2102×31033mod7 Así que 6103(2×3)6mod14 .

18 votos

Función Carmichael suele reducir el exponente más que la función totiente de Euler.

0 votos

En gcd(a,c)1 se puede resumir el último caso como aba(bmodφ)+φ(modc) donde φ=φ(c/gcd(alog2(c),c)) saca todos los factores comunes a la vez y luego aplica el teorema del totiente de Euler. Como log2(c) suele ser muy pequeño, y el algoritmo euclidiano nos permite utilizar la exponenciación modular (elevando al cuadrado), alog2(c) no es un cálculo difícil. Esto tiene la ventaja de que sólo necesitamos calcular el gcd una vez y evita anidar mods repetidamente.

49voto

Michael Hardy Puntos 128804

Probemos 5844325mod21 : 5015155225453452054205165516517561751 Así que multiplicando por 5 seis veces es lo mismo que multiplicar por 1 . Queremos multiplicar por 5 un gran número de veces: 844325 . ¿Cuántas veces multiplicamos por 5 ¿Seis veces? El número de veces 6 entra en 844325 es 140720 con un remanente de 5 . Ese resto es lo que importa. Multiplica por 56 exactamente 140720 veces y eso es lo mismo que multiplicar por 1 tantas veces. Luego multiplique por 5 sólo 5 más veces, y obtener 17 .

Así que 584432517mod21 .

0 votos

Puede que quieras comprobar mi aritmética, pero este método lo hará cuando lo hagas bien.

1 votos

Este método no será tan agradable cuando (5,21)1 ...

8 votos

@aengle: será similar: por ejemplo para 6844325mod21 mirarías 601 , 616 , 6215 , 636 , 6415 por lo que con un periodo de 2 . El número de veces 2 entra en 844325 es 422162 con un remanente de 1 . Así que 684432415mod21 y así 68443256mod21 .

24voto

He aquí dos ejemplos elevar al cuadrado y multiplicar método para 569mod101 :

5695(534)237534(517)288(13)5175(58)25458(54)25854(52)21952(51)225515(1)25

El cálculo comienza con 569 y luego trabajar hacia abajo para crear las dos primeras columnas, y luego calcular los resultados de abajo hacia arriba. (normalmente se omitiría la última línea; la he puesto ahí para aclarar el párrafo siguiente).

Como método abreviado, la representación binaria de 69 es 10001012 la lectura de los dígitos binarios de izquierda a derecha nos indica las operaciones a realizar a partir del valor 1 : 0 dice "cuadrado" y 1 dice "elevar al cuadrado y multiplicar por 5 ".


La otra forma es calcular una lista de cuadrados repetidos:

515522554195858516315325256478

A continuación, calcula qué términos tienes que multiplicar:

569564+4+17819537

22voto

freespace Puntos 9024

Algunos trucos útiles para la exponenciación modular

La intención de este post es recopilar varios trucos que a veces pueden simplificar los cálculos de este tipo. (Especialmente cuando se hacen a mano y no con ordenador o calculadora.) Este post es comunidad-wiki, así que siéntete libre de editarlo si tienes alguna idea para mejorarlo.

Usar complemento: (ca)(a)(modc)

Si el número dado se aproxima a c (pero menor que c ), sustituyéndolo por ca mi ayuda - trabajaremos con números más pequeños. Algunos ejemplos:

  • Si queremos calcular 7777mod50 es útil observar que 72=49(1)(mod50) por lo que podemos sustituir 72 por 1 y obtener 777773887(1)38877(mod50) . (Esto formaba parte de Encuentre 3333+7777(mod50) .)
  • Queremos calcular 5050mod13 . Desde 413=52 tenemos 502(mod13) . Así que podemos trabajar con 2 en lugar de 50 que será más fácil, ya que es un número más pequeño. Cómo utilizar el pequeño teorema de Fermat para hallar 5050(mod13) ?

Si puedes encontrar una potencia cercana al módulo, intenta utilizarla.

Algunos ejemplos:

  • Queremos calcular 61000mod23 . Desde 6=23 veamos si podemos combinar de alguna manera estos dos números para obtener algo con un resto pequeño módulo 23 . Podemos observar que 24=2331(mod23) . También podemos observar que 274(mod23) es decir 3322(mod23) . Sustitución de 22 con 33 en la congruencia anterior obtenemos 2341(mod23) . Ahora podemos combinar las dos congruencias anteriores para obtener 1(233)3(234)2=211311=611(mod23) . Obsérvese que la congruencia 6111(mod23) también puede obtenerse por distintos medios: Encuentre 61000mod23 .
  • Queremos encontrar 5119mod59 . Esto puede resolverse de forma muy sencilla utilizando el pequeño teorema de Fermat: Hallar el resto utilizando el pequeño teorema de Fermat cuando 5119 se divide por 59 ? Sin embargo, olvidemos el pequeño teorema de Fermat y tratemos de encontrar algunas potencias de 5 que dan un resto pequeño módulo 59 . Podemos observar que 53 no está muy lejos de 259 y obtener 531257(mod59) . Del mismo modo, 725 parece no estar muy lejos de 359 así que podemos intentar 55=53527251752(mod59) . Y ahora podemos utilizar 64 es una potencia de dos que se aproxima a nuestro resto para obtener 530=(55)6(2)6645(mod59) . Puesto que tenemos 5305(mod59) y gcd(5,59)=1 podemos cancelar 5 en ambos lados para obtener 5291(mod59) . Y este último dato puede utilizarse en cálculos posteriores.
  • La tarea consiste en encontrar 1674mod65 . Se puede observar que 64 es una potencia de dos muy próxima a 65 . Así que tenemos 26=641(mod65) lo que significa que 1674=(24)74=2296=264922(1)494144(mod65) . Ver también Informática 1674mod65 .

Utilizando el criterio de Euler

Criterio de Euler puede decirnos sobre el valor de ap12 módulo de un primo p . Sin embargo, necesitamos saber si a es un residuo cuadrático módulo p . Para algunos números esto se puede adivinar. A veces se puede comprobar utilizando reciprocidad cuadrática (Por supuesto, esto no es una gran mejora en comparación con el pequeño teorema de Fermat, que nos da ap11(modp) .)

  • Veamos 529mod59 (ya lo hemos calculado anteriormente mediante diferentes cálculos). Es fácil darse cuenta de que 82=645(mod59) Así que 5 es un residuo cuadrático módulo 59 . Así que a partir del criterio de Euler obtenemos 529=5(591)/21(mod29) .

14voto

El teorema chino del resto puede reducir el cálculo necesario. Por ejemplo, podemos factorizar 21=37 y tienen

1723=1

(en general, podemos utilizar el algoritmo euclidiano ampliado para obtener esta fórmula)

Por consiguiente, si

xa(mod3)xb(mod7)

entonces

xa(17)+b(23)(mod21)

Así, podemos calcular 5844325mod21 utilizando nuestros medios favoritos para calcular:

58443252(mod3)58443253(mod7)

y así

584432527+3(6)417(mod21)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X