¿Cómo puedo encontrar el número de todas las tuplas ordenadas [matemáticas] (x, y, z) [/ matemáticas] de manera que [matemáticas] x, y, z [/ matemáticas] son ​​todos enteros positivos que satisfacen la ecuación [matemáticas] x + 2y + 3z = 30 [/ matemáticas]?

El sistema [matemática] x + 2y + 3z = 24 [/ matemática] (donde [matemática] x, y, z [/ matemática] son ​​enteros no negativos) es equivalente a la que ha preguntado.

[matemáticas] x + 2y + 3z = 30 [/ matemáticas]
[matemáticas] \ implica (x-1) + 2 (y-1) + 3 (z-1) = 24 [/ matemáticas]


Vamos a contar el número de soluciones para [matemáticas] x + 2y + 3z = 24 [/ matemáticas].

[matemáticas] x + 2y = 24 – 3z [/ matemáticas]
El RHS puede variar de [matemática] 0 [/ matemática] a [matemática] 24 [/ matemática].

Si [matemática] x + 2y = n [/ matemática], el número de soluciones a la ecuación para [matemática] x [/ matemática] es [matemática] 1 + \ left \ lfloor \ frac {n} 2 \ right \ rfloor [/matemáticas]. Para cada [matemática] x [/ matemática], hay una única [matemática] y [/ matemática].

Entonces, el número total de soluciones son:
[matemáticas] 1 + \ left (1 + \ left \ lfloor \ frac {3} 2 \ right \ rfloor \ right) + \ ldots + \ left (1 + \ left \ lfloor \ frac {24} 2 \ right \ rfloor \ right) = 61. [/ math]

No voy a tratar de ser inteligente. Las ecuaciones como esta se pueden resolver utilizando el módulo de diofantina en la biblioteca de Sympy en lenguaje Python.

>>> de símbolos de importación sympy
>>> de sympy.solvers.diophantine import diophantine
>>> x, y, z = símbolos (‘xy z’)
>>> diofantina (x + 2 * y + 3 * z-30)
conjunto ([(2 * t – 3 * z + 30, -t, z)])
>>> cuenta = 0
>>> para z en el rango (0, 11): # z varía entre 0 y 10
… Para t en el rango (-15, -1, 1): # para que y se extienda entre 0 y 15
… y = -t
… X = 2 * t – 3 * z + 30
… Si x> = 0 yx + 2 * y + 3 * z == 30:
… cuenta + = 1

>>> cuenta
70

Una vez que tenga la solución paramétrica (en la cosita ‘set’) puede configurar un bucle para contar las soluciones.

Siguiendo el ejemplo de Justin Rising y dejando que una computadora haga el trabajo, aquí hay un fragmento de código en C …

  para (z = 1; z <10; z ++)
   para (y = 1; 2 * y + 3 * z <30; y ++)
     printf ("(% d,% d,% d) \ n", 30-3 * z-2 * y, y, z);

Ocasionalmente hay valor en ser inteligente, pero a veces solo debes dejar que una computadora haga el trabajo de fuerza bruta por ti. Aquí hay una solución en R:

  M <- como.matriz (expand.grid (1:30, 1:30, 1:30))
 idx <- M% *% 1: 3 == 30
 n <- sum (idx) # ¿Cuántos?
 vals <- M [which (idx),] # ¿Cuáles?