Dados dos enteros positivos [matemática] a, b [/ matemática] puede haber otros dos enteros positivos [matemática] x, y [/ matemática] tal que [matemática] a ^ 2 + b ^ 2 = x ^ 2 + y ^ 2 [/ matemáticas]?

, podemos encontrar números como este. Lo realmente genial es que podemos hacer esto sin resolver el problema a mano utilizando un probador de teoremas automatizado.

Es una buena demostración para ver porque la mayoría de las personas no se dan cuenta de lo poderosos que pueden ser los probadores de teoremas modernos. Podemos manejar fácilmente todo tipo de problemas, incluso si incluyen cosas como enteros ilimitados , ¡como este!

Para este ejemplo, vamos a utilizar el solucionador SMT de Microsoft, Z3. Esto nos ahorrará bastante pensamiento, lo cual es genial porque pensar apesta :).

Primero, vamos a precisar la pregunta exacta que nos interesa. Una lectura de su pregunta es “¿hay alguna tupla de enteros positivos (a, b, x, y) de tal manera que a / = x, a / = y, b / = x y b / = y y entonces a ^ 2 + b ^ 2 = x ^ 2 + y ^ 2 tiene? ” En realidad, es muy fácil escribir un programa que verifique esto. Voy a usar una biblioteca de Haskell llamada Data.SBV para interactuar con Z3.

Comenzaré escribiendo una útil función auxiliar que nos permite generar variables que se extiendan sobre enteros positivos. Queremos tanto ∀ como ∃, así que también parametrizaremos sobre el cuantificador:

  nombre del cuantificador natural =
   do n :: SInteger  0)
      volver n

Esto solo asegura que n sea ​​un número entero simbólico (eso es lo que significa “S” en SInteger) limitado a ser siempre positivo.

A continuación, vamos a preguntar si existen cuatro enteros con otras restricciones:

  teorema = hacer un <- natural existe "a"
              b <- natural existe "b"
              x <- existe natural "x"
              y <- natural existe "y"
              restringir (a ./= x &&& a ./= y)
              restringir (b ./= x &&& b ./= y)
              restringir (a. <= b &&& x. <= y &&& a. <= x)
              return (a ^ 2 + b ^ 2. == x ^ 2 + y ^ 2)

Este código solo introduce nuestras variables, asegura que sean distintas y verifica nuestra restricción de “suma de cuadrados”. Realmente, solo está reescribiendo nuestra pregunta original en una sintaxis un poco extraña. Los operadores son feos sobre todo porque las versiones bonitas ya están tomadas por la biblioteca estándar de Haskell.

Agregué la restricción adicional de que a ≤ b y x ≤ y para filtrar soluciones que son las mismas, excepto para intercambiar a con b o x con y. Esto será útil cuando queramos enumerar un montón de soluciones.

Ahora podemos pedirle a z3 que resuelva nuestras variables:

  * Datos principales.SBV> teorema sat
 Satisfable  Modelo:
   a = 16 :: SInteger
   b = 2 :: SInteger
   x = 8 :: SInteger
   y = 14 :: SInteger

Y ahí lo tiene: ¡un ejemplo que se ajusta a lo que estaba pidiendo! También podemos pedir cada tupla, y estaremos encantados de imprimirlas. Estoy bastante seguro de que hay un número infinito de estos, por lo que puede llevar un tiempo.]

  * Datos principales.SBV> allSat teorema
 Solución # 1:
   a = 16 :: SInteger
   b = 2 :: SInteger
   x = 8 :: SInteger
   y = 14 :: SInteger
 Solución # 2:
   a = 1 :: SInteger
   b = 32 :: SInteger
   x = 8 :: SInteger
   y = 31 :: SInteger
 ...

Ahora, ¿qué tal una pregunta diferente? ¿Es posible encontrar tal x, y para todos los pares a, b? Solo podemos modificar nuestro código original:

  teorema '= hacer un <- forall natural "a"
               b <- para toda la vida "b"
               x <- existe natural "x"
               y <- natural existe "y"
               restringir (a ./= x &&& a ./= y)
               restringir (b ./= x &&& b ./= y)
               restringir (a. <= b &&& x. <= y &&& a. <= x)
               return (a ^ 2 + b ^ 2. == x ^ 2 + y ^ 2)

Ahora lo ejecutamos nuevamente:

  * Datos principales.SBV> teorema sat '
 Insatisfactorio

No. No podemos hacer esto para todos los pares de enteros positivos. Demasiado.

Si quieres jugar con esto tú mismo, puedes tomar mi código: Suma de cuadrados con Z3

También necesitará instalar SBV. Lea 24 Days of Hackage: sbv para una introducción a la biblioteca.

También podemos hacer un razonamiento más complicado. Por ejemplo, el artículo que Justin Rising enlazó tiene una lista elegante de sumas que se pueden escribir así. ¡Podemos generar esa misma lista nosotros mismos, reutilizando el theorem de arriba!

El truco es que podemos descomprimir un resultado en un contenedor de algún tipo. Aquí hay un práctico programa de ayuda que solo enumera las soluciones a este problema:

  generateList = do result  print $ a ^ 2 + b ^ 2

Desafortunadamente, esto sigue enumerando soluciones para siempre sin un orden apreciable. El orden en que se generan las soluciones depende del funcionamiento interno del solucionador, por lo que no podemos confiar realmente en él. Lo que realmente queremos es generar todas las soluciones de manera que a ^ 2 + b ^ 2 sea menor que algún límite.

De hecho, esta es una táctica que terminamos usando con bastante frecuencia al resolver problemas con solucionadores SMT. Al elegir un límite arbitrario y reducirlo, podemos obtener soluciones en el rango que deseamos o incluso optimizar una solución.

Primero, modificamos el theorem para tomar un límite:

  upTo limit = do a <- natural existe "a"
                 b <- natural existe "b"
                 x <- existe natural "x"
                 y <- natural existe "y"
                 restringir $ a ./= x &&& a ./= y
                 restringir $ b ./= x &&& b ./= y
                 restringir $ a. <= b &&& x. <= y &&& a. <= x
                 restringir $ a ^ 2 + b ^ 2. == x ^ 2 + y ^ 2
                 devuelve $ a ^ 2 + b ^ 2. <= límite

Luego hacemos lo mismo para nuestra función auxiliar:

  generateListUpTo limit =
   hacer resultado <- allSat (hasta el límite)
      dejemos sumSq [a, b] = a ^ 2 + b ^ 2
          ls :: [Entero] = ordenar.  map (sumSq. take 2) $ extractModels resultado
      forM_ ls print

Finalmente, podemos ejecutar esto.

  * Datos principales.SBV> generateListUpTo 205
 50
 sesenta y cinco
 85
 125
 130
 145
 170
 185
 200
 205

Oye, obtuvimos el mismo resultado que el documento vinculado sin hacer ningún cálculo real . Bastante cargada.

No necesita un ‘algoritmo’ para esta respuesta. Fermat consideró este problema y lo investigó mucho después de que él se fuera. Solo necesita un hecho de la teoría de números y un poco de números complejos.

Antes de profundizar en ello, observe la magia de [math] 65 [/ math]:

[matemáticas] 65 = 13 \ cdot 5 = (3 ^ 2 + 2 ^ 2) (2 ^ 2 + 1 ^ 2). [/ matemáticas]

Ahora, aquí es donde introducimos números complejos. Una forma de escribir la expresión anterior es:

[matemáticas] 65 = | (3+ 2i) (2 + i) | ^ 2 = | 4 + 7i | ^ 2 = 4 ^ 2 + 7 ^ 2. [/ matemáticas]

Otra forma es dos grupos de una pieza con los otros conjugados:

[matemáticas] 65 = | (3+ 2i) (2 – i) | ^ 2 = | 8 + i | ^ 2 = 8 ^ 2 + 1 ^ 2. [/ matemáticas]

Por lo tanto, [matemática] 8 ^ 2 + 1 ^ 2 = 4 ^ 2 + 7 ^ 2. [/ Matemática]

Bueno, esto parece un truco genial, pero ¿resuelve el problema de encontrar TODOS los números que se pueden escribir como la suma de dos cuadrados de dos maneras diferentes? La respuesta es sí y necesitamos un poco de ayuda de la siguiente observación de Fermat:

Hecho: Cada primo de la forma [matemática] 4k + 1 [/ matemática] se puede escribir como la suma de dos cuadrados de una manera única.

Con cualquier número que tenga dos factores primos de la forma [matemática] 4k + 1 [/ matemática], podemos hacer el truco que hicimos con [matemática] 65 [/ matemática] anterior. El truco es escribir el número como producto de sus factores primos y luego expresar los factores primos como la suma de los cuadrados. Ahora introduzca números complejos y multiplique dos números complejos no conjugados para obtener un nuevo número complejo. Esto se puede hacer de dos formas. El módulo de cada uno de estos números complejos multiplicados es el mismo y, por lo tanto, encontramos una manera de escribir un número como la suma de dos cuadrados de dos maneras diferentes.

El primer [matemáticas] 2 [/ matemáticas] es un poco raro. Los factores de dos son [matemática] 1 + i [/ matemática] y [matemática] 1-i [/ matemática]. Estos factores cuando se agrupan con otros números complejos dan casi los mismos números complejos. Pero un número de la forma [matemática] 2m [/ matemática] donde m tiene al menos dos factores primos de la forma [matemática] 4k + 1 [/ matemática] todavía funciona.

Déjame mostrarte el truco de agrupación para [math] 50 [/ math].

[matemáticas] 50 = 2 \ cdot 25 = (1 ^ 2 + 1 ^ 2) (1 ^ 2 + 2 ^ 2) (1 ^ 2 + 2 ^ 2) [/ matemáticas]

Usando números complejos:

[matemáticas] 50 = | (1 + i) (1- 2i) (1 + 2i) | ^ 2 [/ matemáticas]

[matemáticas] 50 = | (3-i) (1 + 2i) | ^ 2 [/ matemáticas]

[matemáticas] 50 = | (3-i) (1 + 2i) | ^ 2 = | 5 + 5i | ^ 2. [/matemáticas]

Aquí hay otra forma de escribirlo:

[matemáticas] 50 = | (1 + i) (1+ 2i) (1 + 2i) | ^ 2 [/ matemáticas]

[matemáticas] 50 = | (1 + i) (- 3 + 4i) | ^ 2 [/ matemáticas]

[matemáticas] 50 = | (1 + i) (- 3 + 4i) | ^ 2 = | -7 + i | ^ 2. [/matemáticas]

Por lo tanto, [matemática] 50 = 7 ^ 2 + 1 ^ 2 = 5 ^ 2 + 5 ^ 2. [/ Matemática]

1) Nuestro método explica la lista de Tikhon Jelvis:

Nuestro método nos pide que enumeremos todos los números que tienen dos o más factores primos de la forma [matemática] 4k + 1 [/ matemática]. Los primeros números primos de este tipo son [matemática] 5,13,17,29,37,41. [/ Matemática] Debido al comportamiento extraño de 2, necesitamos una potencia impar de 2 para dividir el número. Multiplicarlos y enumerarlos en orden creciente nos da:

[matemáticas] 50 = 2.5.5 [/ matemáticas]

[matemáticas] 65 = 5.13 [/ matemáticas]

[matemáticas] 85 = 5.17 [/ matemáticas]

[matemáticas] 125 = 5.5.5 [/ matemáticas]

[matemáticas] 130 = 2.5.13 [/ matemáticas]

[matemáticas] 145 = 5.29 [/ matemáticas]

[matemáticas] 170 = 2.5.17 [/ matemáticas]

[matemáticas] 185 = 5.37 [/ matemáticas]

[matemáticas] 200 = 2.2.2.5.5 [/ matemáticas]

[matemáticas] 205 = 5.41 [/ matemáticas]

2) Explica el comportamiento extraño observado en el artículo compartido por Justin Rising. Los autores de ese artículo observan una lista similar a la lista de Tikhon y se preguntan si todos los números con esta bonita propiedad son divisibles por [math] 5 [/ math]. La lista anterior parece conformar este patrón.

¡Pero lo sabemos mejor! Esto simplemente sucede porque 13 es mucho más grande que 5. De hecho, si multiplicamos 13 y 17, obtenemos el primer ejemplo contrario a la afirmación de que dichos números son divisibles por 5.

[matemáticas] 221 = 13.17 = 10 ^ 2 + 11 ^ 2 = 14 ^ 2 + 5 ^ 2 [/ matemáticas]

De hecho, ¡cualquier número con dos o más factores primos de la forma [matemática] 4k + 1 [/ matemática] que no sea divisible por 5 servirá!

3) Como ejercicio, trate de calcular la descomposición como la suma de dos cuadrados para el ejemplo de Sundaram: 85.

http://www.cs.toronto.edu/~macka … describe un algoritmo para generar tuplas [math] (a, b, x, y) [/ math] con esta propiedad. El ejemplo más pequeño es [matemática] 50 [/ matemática], que es [matemática] 1 ^ 2 + 7 ^ 2 [/ matemática] y [matemática] 5 ^ 2 + 5 ^ 2 [/ matemática]. El ejemplo más pequeño donde no hay dos valores iguales es [matemática] 65 [/ matemática], que es [matemática] 1 ^ 2 + 8 ^ 2 [/ matemática] y [matemática] 4 ^ 2 + 7 ^ 2 [/ matemáticas].

Respuesta: Sí, puede, pero no siempre es necesario que existan tales números.

Argumento:

Sabemos que hay infinitos pares de trillizos pitagóricos. (La prueba está más allá del alcance de esta pregunta, pero se puede acceder en línea)

Que haya dos trillizos [matemática] (a, b, c) [/ matemática] y [matemática] (x, y, z) [/ matemática] tal que [matemática] (a, b, c) [/ matemática] no es un múltiplo escalar de [matemáticas] (x, y, z) [/ matemáticas], es decir, [matemáticas] \ frac {a} {x} \ neq \ frac {b} {y} [/ matemáticas] ( Dichos múltiplos también existen y pueden demostrarse fácilmente, por ejemplo (3,4,5) y (5,12,13)

Considero d = LCM (c, z) tal que [matemática] d = \ k_1 c = \ k_2 z. [/ Matemática]

Tenemos:

[matemáticas] a ^ 2 + b ^ 2 = c ^ 2 [/ matemáticas]
[matemáticas] \ implica (\ k_1 a) ^ 2 + (\ k_1 b) ^ 2 = (\ k_1 c) ^ 2 [/ matemáticas]

Y de la misma manera, [matemáticas] (\ k_2 x) ^ 2 + (\ k_2 y) ^ 2 = (\ k_2 z) ^ 2 [/ matemáticas]

Y, [matemáticas] d ^ 2 = (\ k_1 c) ^ 2 = (\ k_2 z) ^ 2 [/ matemáticas]
[matemáticas] \ implica d ^ 2 = (\ k_1 a) ^ 2 + (\ k_1 b) ^ 2 = (\ k_2 x) ^ 2 + (\ k_2 y) ^ 2 = (\ k_2 z) ^ 2 [/ matemáticas]

Sabemos que [math] \ k_1, a, b, \ k_2, x [/ math] y [math] y [/ math] son ​​enteros, por lo tanto,

[matemáticas] (\ k_1 a) ^ 2 + (\ k_1 b) ^ 2 = (\ k_2 x) ^ 2 + (\ k_2 y) ^ 2 = (\ k_2 z) ^ 2 [/ matemáticas]

Es un caso deseado.

Pero esto es cierto, solo si los dos números dados (como se define como ayb en la pregunta) son [matemáticas] \ k_1 a [/ matemáticas] y [matemáticas] \ k_1 b [/ matemáticas]

Por lo tanto, ‘puede’ haber otros dos enteros cuyo cuadrado suma al cuadrado de dos enteros dados. Pero, ¿es necesario que esto sea válido para cada par? ¡NO! Un ejemplo de contador es suficiente como prueba, y el ejemplo que selecciono es [matemática] a = b = 1 [/ matemática]

No hay dos enteros positivos cuya suma sea 2, aparte del caso en que ambos son uno.

Espero que esto responda la pregunta.

Creo que esto responderá la pregunta por completo. Ver Pruebas del teorema de Fermat sobre sumas de dos cuadrados primero. Entonces, puedes probar el siguiente hecho:
Si [matemáticas] n = 2 ^ aq_1 ^ {a_1} \ cdots q_k ^ {a_k} p_1 ^ {e_1} \ cdots p_l ^ {e_l} [/ math]
donde [matemáticas] q_i \ equiv3 \ pmod4 [/ matemáticas] y [matemáticas] p_i \ equiv1 \ pmod4 [/ matemáticas] y [matemáticas] D = (e_1 + 1) \ cdots (e_l + 1) [/ matemáticas], el El número de formas de escribir [matemáticas] n [/ matemáticas] como una suma de cuadrados (sin ignorar las órdenes y signos) es:
[matemática] 0 [/ matemática] si [matemática] a_i [/ ​​matemática] es impar para algunos [matemática] i [/ matemática], [matemática] \ dfrac D2 [/ matemática] si [matemática] D [/ matemática] es incluso, de lo contrario, [math] \ dfrac12 \ left (D – (- 1) ^ {a} \ right) [/ math]
También se puede indicar de manera diferente como [matemática] \ sum \ limits_ {d | n, d \ mbox {impar}} (- 1) ^ {\ frac {d-1} 2} [/ matemática] ignorando solo los signos

No hay necesidad de nada más allá de Python, ¿eh? De una manera que repele a muchos, si no a la mayoría de los lectores de esta respuesta, esta es la idea esencial.

Francamente, esta respuesta fue una reacción leve a algunas de las otras y me pregunto por qué la gente la rechazaría. ¿Qué pasaría si quisiera hacer frente a esta simple pregunta y no estuviera familiarizado con la teoría de números, los algoritmos publicados o los solucionadores de teoremas de software?

La función latticeWalk en este script genera la secuencia (1,1), (1,2), (2,2), (1,3), (2,3), (3,3), (1,4) , (2,4), (3,4), (4,4), (1,5), (2,5), (3,5), (4,5), (5,5), ( 1,6), (2,6), (3,6),…. El bucle for acepta los resultados de esta función, ignora aquellos que no son distintos de a y b e imprime el primer par cuya suma de cuadrados es igual a las sumas de cuadrados de a y b.

Ya es obvio que tenemos un caso que prueba la hipótesis. Esto no es un algoritmo; sin embargo, podría ser la base para identificar 4 tuplas adicionales.

X ^ 2 + y ^ 2 = a ^ 2 + b ^ 2

Que

(X + a) (Xa) = (b + y) (por) ahora es mucho más fácil de tratar y por ejemplo tenemos

21 * 1 = 7 * 3, entonces X = 11, a = 10, b = 5 e y = 2 (los números deben ser todos pares o impares para evitar fracciones)

(X + a) = 21

(Xa) = 1

(b + y) = 7

(por) = 3

de 11 ^ 2 + 2 ^ 2 = 10 ^ 2 + 5 ^ 2 = 125,

También tenemos: 48 = 6 * 8 = 12 * 4

X = 7, a = 1, b = 8 e y = 4

49 + 16 = 64 + 1

O de nuevo 55 = 11 * 5 = 55 * 1

X = 8, a = 3, b = 28 e y = 27

8 ^ 2 + 27 ^ 2 = 3 ^ 2 + 28 ^ 2

En general, podemos encontrar infinidad de soluciones simplemente resolviendo un sistema de ecuaciones muy fácil de la siguiente manera, encuentre 4 números r, t, e, f donde r * t = e * f

(X + a) = r

(Xa) = t

Donde r> = t

b + y = e

(por) = f

Donde e> = f

Lo que hace esta pregunta es hacer un rompecabezas interesante … ¿se puede escribir un número como la suma de cuadrados de 2 números diferentes de dos o más formas diferentes? Una extensión de este problema es el problema del taxi

Números Ramanujan y el problema del taxi

considere los números 1, 7, 5, 5
[matemáticas] 1 ^ 2 + 7 ^ 2 = 5 ^ 2 + 5 ^ 2
// 1 ^ 2 + 8 ^ 2 = 4 ^ 2 + 7 ^ 2 [/ matemáticas]

Tenga en cuenta que en todos los casos, tenemos números primos relativos, ya que mcd (1,7,5,5) = 1, no considere el mcd de a, byx, y por separado 😀

mcd (1,8,4,7) = 1
Tampoco es necesario que al menos una variable a, b, x, y sea 1.

Saludos 🙂

Es muy sencillo. Haga un círculo centrado en el origen con un radio r tal que r ^ 2 sea un número entero. Siga inflándolo y todos los puntos enteros cortados para un valor particular de r serán la respuesta de la solución anterior.
En cuanto a la prueba. Puede tomar la coordenada polar en este círculo como (r cos θ, r sin θ) y resolver los valores integrales.
Por ej. Un círculo de radio de 65 unidades. tiene dos puntos integrales (39,52) para coordenadas polares donde cos θ = 3/5 y sen θ = 4/5. Este círculo también tiene otro punto integral (25,60) para coordenadas polares donde cos θ = 5/13 y sen θ = 12/13.

Creo que esto debería ser suficiente. Avíseme si tiene algún problema con esta solución en los comentarios a continuación.

a = 5, b = 5, x = 1, y = 7 es una solución que viene a la mente. Estoy seguro de que hay otros donde todos los números son diferentes. No estoy seguro si eso es lo que quisiste decir.

9 * 9 + 1 * 1 = 85; 6 * 6 + 7 * 7 = 85