Calculador de Binomio de Newton [Python]

Iniciado por CaronteGold, 30 Diciembre 2009, 20:12 PM

0 Miembros y 1 Visitante están viendo este tema.

CaronteGold

Buenas,

Pues publico el código para realizar el binomio de newton, tanto con incógnitas como sin ellas, sé que está muy lioso el código, sobran las variables de potencias, ( me guié por Batch en el que para potencias no había x**y) , pero bueno, la cosa es que cumple la función, está puesto para uso ... diría escolar xD, es decir no presenta la solución, si no que la resuelve en los dos pasos.

Lo publico como guía o cualquier cosa, si le sirve a alguien, estaría bien. Si queréis mejorar el código o algo, ahí lo tenéis.

Una cosa, este símbolo ---> ^ , es para potencias, quiere decir elevado, ejemplo: 10^9 , sería 10 elevado a potencia 9.


Saludos.

Código (python) [Seleccionar]
# -*- coding: cp1252 -*-
import math

print("Binomio de Newton")

# Aqui pido los datos , numeros, potencias y en caso de que haya incognitas tambien
a = input("Primer numero: ")
incoga = raw_input("Incognita (si no hay, poner guion -): ")
b = input("Segundo numero: ")
incogb = raw_input("Incognita (si no hay, poner guion -): ")
pot = input("Potencia: ")
if incoga == "-" and incogb == "-":
print(" \n ("+str(a)+"+"+str(b)+")"+"^"+str(pot))

else:
print (" \n ("+str(a)+incoga+"+"+str(b)+incogb+")"+"^"+str(pot))

# estas son las variables que hay que usar para el binomio ( los datos del triangulo de Tartaglia o Pascal)

cuno = 1
cdos = 5
ctres = 10
ccuatro = 10
ccinco = 5
cseis = 1
cuuno = 1
cudos = 4
cutres = 6
cucuatro = 4
cucinco = 1
seuno = 1
sedos = 6
setres = 15
secuatro = 20
secinco = 15
seseis = 6
sesiete = 1
siuno = 1
sidos = 7
sitres = 21
sicuatro = 35
sicinco = 35
siseis = 21
sisiete = 7
siocho = 1
ocuno = 1
ocdos = 8
octres = 28
occuatro = 56
occinco = 70
ocseis = 56
ocsiete = 28
ococho = 8
ocnueve = 1
nuuno = 1
nudos = 9
nutres = 36
nucuatro = 84
nucinco = 126
nuseis = 126
nusiete = 84
nuocho = 36
nunueve = 9
nudiez = 1

# anteriormente lo habia hecho en batch, entonces las potencias las hice en variables, pero seria mejor no hacerlo como yo, es decir para las potencias poner en la operación a**6 (ejemplo).

panueve = a**9
paocho = a**8
pasiete = a**7
paseis = a**6
pacinco = a**5
pacuatro = a**4
patres = a**3
pados = a**2

pbnueve = b**9
pbocho = b**8
pbsiete = b**7
pbseis = b**6
pbcinco = b**5
pbcuatro = b**4
pbtres = b**3
pbdos = b**2

# en caso de que no haya incognitas se ejecutan estos bloques
if incoga == "-" and incogb == "-":

if pot == 4:
print " \n " ,cuuno, "*" ,pacuatro, "+" ,cudos, "*" ,patres, "*" ,b, "+" ,cutres, "*" ,pados, "*" ,pbdos, "+" ,cucuatro, "*" ,a, "*" ,pbtres, "+" ,cucinco, "*" ,pbcuatro,
print " \n \n Solucion final:" ,cuuno*pacuatro+cudos*patres*b+cutres*pados*pbdos+cucuatro*a*pbtres+cucinco*pbcuatro

if pot == 5:
print " \n " ,cuno, '*' ,pacinco, "+" ,cdos, "*" ,pacuatro, "*" ,b, "+" ,ctres, "*" ,patres, "*" ,pbdos, "+" ,ccuatro, "*" ,pados, "*" ,pbtres, "+" ,ccinco, "*" ,a, "*" ,pbcuatro, "+" ,cseis, "*" ,pbcinco,
print " \n \n Solucion final:" ,cuno*pacinco+cdos*pacuatro*b+ctres*patres*pbdos+ccuatro*pados*pbtres+ccinco*a*pbcuatro+cseis*pbcinco
if pot == 6:
print " \n " ,seuno, "*" ,paseis, "+" ,sedos, "*" ,pacinco, "*" ,b, "+" ,setres, "*" ,pacuatro, "*" ,pbdos, "+" ,secuatro, "*" ,patres, "*" ,pbtres, "+" ,secinco, "*" ,pados, "*" ,pbcuatro, "+" ,seseis, "*" ,a, "*" ,pbcinco, "+" ,sesiete, "*" ,pbseis,
print " \n \n Solucion final:" ,seuno*paseis+sedos*pacinco*b+setres*pacuatro*pbdos+secuatro*patres*pbtres+secinco*pados*pbcuatro+seseis*a*pbcinco+sesiete*pbseis

if pot == 7:
print " \n " ,siuno, "*" ,pasiete, "+" ,sidos, "*" ,paseis, "*" ,b, "+" ,sitres, "*" ,pacinco, "*" ,pbdos, "+" ,sicuatro, "*" ,pacuatro, "*" ,pbtres, "+" ,sicinco, "*" ,patres, "*" ,pbcuatro, "+" ,siseis, "*" ,pados, "*" ,pbcinco, "+" ,sisiete, "*" ,a, "*" ,pbseis, "+" ,siocho, "*" ,pbsiete,
print " \n \n Solucion final:" ,siuno*pasiete+sidos*paseis*b+sitres*pacinco*pbdos+sicuatro*pacuatro*pbtres+sicinco*patres*pbcuatro+siseis*pados*pbcinco+sisiete*a*pbseis+siocho*pbsiete

if pot == 8:
print " \n " ,ocuno, "*" ,paocho, "+" ,ocdos, "*" ,pasiete, "*" ,b, "+" ,octres, "*" ,paseis, "*" ,pbdos, "+" ,occuatro, "*" ,pacinco, "*" ,pbtres, "+" ,occinco, "*" ,pacuatro, "*" ,pbcuatro, "+" ,ocseis, "*" ,patres, "*" ,pbcinco, "+" ,ocsiete, "*" ,pados, "*" ,pbseis, "+" ,ococho, "*" ,a, "*" ,pbsiete, "+" ,ocnueve, "*" ,pbocho
print " \n \n Solucion final:" ,ocuno*paocho+ocdos*pasiete*b+octres*paseis*pbdos+occuatro*pacinco*pbtres+occinco*pacuatro*pbcuatro+ocseis*patres*pbcinco+ocsiete*pados*pbseis+ococho*a*pbsiete+ocnueve*pbocho

if pot == 9:
print " \n " ,nuuno, "*" ,panueve, "+" ,nudos, "*" ,paocho, "*" ,b, "+" ,nutres, "*" ,pasiete, "*" ,pbdos, "+" ,nucuatro, "*" ,paseis, "*" ,pbtres, "+" ,nucinco, "*" ,pacinco, "*" ,pbcuatro, "+" ,nuseis, "*" ,pacuatro, "*" ,pbcinco, "+" ,nusiete, "*" ,patres, "*" ,pbseis, "+" ,nuocho, "*" ,pados, "*" ,pbsiete, "+" ,nunueve, "*" ,a, "*" ,pbocho, "+" ,nudiez, "*" ,pbnueve,
print " \n \n Solucion final:" ,nuuno*panueve+nudos*paocho*b+nutres*pasiete*pbdos+nucuatro*paseis*pbtres+nucinco*pacinco*pbcuatro+nuseis*pacuatro*pbcinco+nusiete*patres*pbseis+nuocho*pados*pbsiete+nunueve*a*pbocho+nudiez*pbnueve

# si hay incognitas se ejecuta esto otro
else:

if pot ==4:
print " \n " ,cuuno, "*" ,str(pacuatro) + incoga +"^4", "+" ,cudos, "*" ,str(patres) + incoga+"^3", "*" ,str(b) + incogb, "+" ,cutres, "*" ,str(pados) + incoga+"^2", "*" ,str(pbdos) + incogb+"^2", "+" ,cucuatro, "*" ,str(a) + incoga, "*" ,str(pbtres) + incogb+"^3", "+" ,cucinco, "*" ,str(pbcuatro) + incogb+"^4",
print " \n \n Solucion final:" ,str(cuuno*pacuatro) + incoga+"^4","+",str(cudos*patres) + incoga+"^3","*",str(b) + incogb,"+",str(cutres*pados) + incoga+"^2","*",str(pbdos) + incogb+"^2","+",str(cucuatro*a) + incoga,"*",str(pbtres) + incogb+"^3","+",str(cucinco*pbcuatro) + incogb+"^4"
if pot == 5:
print " \n " ,cuno,'*',str(pacinco) + incoga+"^5","+",cdos,"*",str(pacuatro) + incoga+"^4","*",str(b) + incogb,"+",ctres,"*",str(patres) + incoga+"^3","*",str(pbdos) + incogb+"^2","+",ccuatro,"*",str(pados) + incoga+"^2","*",str(pbtres) + incogb+"^3","+",ccinco,"*",str(a) + incoga,"*",str(pbcuatro)+ incogb+"^4","+",cseis,"*",str(pbcinco) + incogb+"^5",
print " \n \n Solucion final:" ,str(cuno*pacinco) + incoga+"^5","+",str(cdos*pacuatro) + incoga+"^4","*",str(b) + incogb,"+",str(ctres*patres) + incoga+"^3","*",str(pbdos)+ incogb+"^2","+",str(ccuatro*pados) + incoga+"^2","*",str(pbtres) + incogb+"^3","+",str(ccinco*a) + incoga,"*",str(pbcuatro) + incogb+"^4","+",str(cseis*pbcinco) + incogb+"^5",

if pot == 6:
print " \n " ,seuno,"*",str(paseis) + incoga+"^6","+",sedos,"*",str(pacinco) + incoga+"^5","*",str(b) + incogb,"+",setres,"*",str(pacuatro) + incoga+"^4","*",str(pbdos) + incogb+"^2","+",secuatro,"*",str(patres) + incoga+"^3","*",str(pbtres) + incogb+"^3","+",secinco,"*",str(pados) + incoga+"^2","*",str(pbcuatro) + incogb+"^4","+",seseis,"*",str(a) + incoga,"*",str(pbcinco) + incogb+"^5","+",sesiete,"*",str(pbseis) + incogb+"^6",
print " \n \n Solucion final:" ,str(seuno*paseis) + incoga+"^6","+",str(sedos*pacinco) + incoga+"^5","*",str(b) + incogb,"+",str(setres*pacuatro) + incoga+"^4","*",str(pbdos) + incogb+"^2","+",str(secuatro*patres) + incoga+"^3","*",str(pbtres) + incogb+"^3","+",str(secinco*pados) + incoga+"^2","*",str(pbcuatro) + incogb+"^4","+",str(seseis*a) + incoga,"*",str(pbcinco) + incogb+"^5","+",str(sesiete*pbseis) + incogb+"^6",

if pot == 7:
print " \n " ,siuno,"*",str(pasiete) + incoga+"^7","+",sidos,"*",str(paseis) + incoga+"^6","*",str(b) + incogb,"+",sitres,"*",str(pacinco) + incoga+"^5","*",str(pbdos) + incogb+"^2","+",sicuatro,"*",str(pacuatro) + incoga+"^4","*",str(pbtres) + incogb+"^3","+",sicinco,"*",str(patres) + incoga+"^3","*",str(pbcuatro) + incogb+"^4","+",siseis,"*",str(pados) + incoga+"^2","*",str(pbcinco) + incogb+"^5","+",sisiete,"*",str(a) + incoga,"*",str(pbseis) + incogb+"^6", "+" ,siocho, "*" ,str(pbsiete) + incogb+"^7",
print " \n \n Solucion final:" ,str(siuno*pasiete) + incoga+"^7","+",str(sidos*paseis) + incoga+"^6","*",str(b) + incogb,"+",str(sitres*pacinco) + incoga+"^5","*",str(pbdos) +incogb+"^2","+",str(sicuatro*pacuatro) +incoga+"^4","*",str(pbtres) + incogb+"^3","+",str(sicinco*patres) + incoga+"^3","*",str(pbcuatro) + incogb+"^4","+",str(siseis*pados) + incoga+"^2","*",str(pbcinco) + incogb+"^5","+",str(sisiete*a) + incoga,"*",str(pbseis)+ incogb+"^6","+",str(siocho*pbsiete) + incogb +"^7",

if pot == 8:
print " \n " ,ocuno,"*",str(paocho) + incoga+"^8","+",ocdos,"*",str(pasiete) + incoga+"^7","*",str(b) + incogb,"+",octres,"*",str(paseis) + incoga+"^6","*",str(pbdos) + incogb+"^2","+",occuatro,"*",str(pacinco) + incoga+"^5","*",str(pbtres) + incogb+"^3","+",occinco,"*",str(pacuatro) + incoga+"^4","*",str(pbcuatro) + incogb+"^4","+",ocseis,"*",str(patres) + incoga+"^3","*",str(pbcinco) + incogb+"^5","+",ocsiete,"*",str(pados) + incoga+"^2","*",str(pbseis) + incogb+"^6","+",ococho,"*",str(a) + incoga,"*",str(pbsiete) + incogb+"^7","+",ocnueve,"*",str(pbocho) + incogb+"^8"
print " \n \n Solucion final:" ,str(ocuno*paocho) + incoga+"^8","+",str(ocdos*pasiete) + incoga+"^7","*",str(b) + incogb,"+",str(octres*paseis) + incoga+"^6","*",str(pbdos) + incogb+"^2","+",str(occuatro*pacinco) + incoga+"^5","*",str(pbtres) + incogb+"^3","+",str(occinco*pacuatro) + incoga+"^4","*",str(pbcuatro) + incogb+"^4","+",str(ocseis*patres) + incoga+"^3","*",str(pbcinco) + incogb+"^5","+",str(ocsiete*pados) + incoga+"^2","*",str(pbseis) + incogb+"^6","+",str(ococho*a) + incoga,"*",str(pbsiete) + incogb+"^7","+",str(ocnueve*pbocho) + incogb+"^8"

if pot == 9:
print " \n " ,nuuno,"*",str(panueve) + incoga+"^9","+",nudos,"*",str(paocho) + incoga+"^8","*",str(b) + incogb,"+",nutres,"*",str(pasiete) + incoga+"^7","*",str(pbdos) + incogb+"^2","+",nucuatro,"*",str(paseis) + incoga+"^6","*",str(pbtres) + incogb+"^3","+",nucinco,"*",str(pacinco) + incoga+"^5","*",str(pbcuatro) + incogb+"^4","+",nuseis,"*",str(pacuatro) + incoga+"^4","*",str(pbcinco) + incogb+"^5","+",nusiete,"*",str(patres) + incoga+"^3","*",str(pbseis) + incogb+"^6","+",nuocho,"*",str(pados) + incoga+"^2","*",str(pbsiete) + incogb+"^7","+",nunueve,"*",str(a) + incoga,"*",str(pbocho) + incogb+"^8","+",nudiez,"*",str(pbnueve) + incogb+"^9",
print " \n \n Solucion final:" ,str(nuuno*panueve) + incoga+"^9","+",str(nudos*paocho) + incoga+"^8","*",str(b) + incogb,"+",str(nutres*pasiete) + incoga+"^7","*",str(pbdos) + incogb+"^2","+",str(nucuatro*paseis) + incoga+"^6","*",str(pbtres) + incogb+"^3","+",str(nucinco*pacinco) + incoga+"^5","*",str(pbcuatro) + incogb+"^4","+",str(nuseis*pacuatro) + incoga+"^4","*",str(pbcinco) + incogb+"^5","+",str(nusiete*patres) + incoga+"^3","*",str(pbseis) + incogb+"^6","+",str(nuocho*pados) + incoga+"^2","*",str(pbsiete) + incogb+"^7","+",str(nunueve*a) + incoga,"*",str(pbocho) + incogb+"^8","+",str(nudiez*pbnueve) + incogb+"^9"

raw_input()

Novlucker

#1
Bueno, como te había comentado por privado, el código es muy pero muy mejorable ya que tienes muchas cosas hechas a "mano", como la lógica de las fórmulas para las diferentes potencias, así que en cuanto tenga tiempo cuelgo otro code :P , no obstante, sigue adelante ;)

Saludos

P.d: usuario de python 3.x, si vas a probar el script necesita ligeras modificaciones, funciona ok en la versión 2.6
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Masita

#2
Es una tonteria pero ese codigo no funcionaria. Se te ha olvidado tabular despues de cada "if" es algo que hay que tener muy en cuenta en python.  ;)

Bueno te dejo un poco de codigo con otra forma de hacerlo

Código (python) [Seleccionar]

a = int(raw_input("ingresa el primer numero:  "))
b = int(raw_input("ingresa el segundo numero:  "))
n = int(raw_input("ingresa el exponente:  "))
x = (a+b)**n

if n == 1:
print a,"+",b
print x
if n == 2:
print "%d^2 + 2*%d*%d + %d^2" % (a,a,b,b)
print x
if n == 3:
print "%d^3 + 3*%d^2*%d + 3*%d*%d^2 + %d^3" % (a,a,b,a,b,b)
print x

Bueno y luego seguiria con 4,5,6...... pero es tarde y me voy a la cama, supongo que habra alguna manera con bucles de hacerlo aun mas sencillo...

Saludos y feliz python!
En el cielo estan suspendidas las palabras que cantamos en nuestros sueños....

Novlucker

Lo de las tabulaciones, "mea culpa", el código estaba algo desordenado y cuando lo "arreglé" desaparecieron, desde hace un tiempo ocurre con firefox que por alguna razón las tabulaciones desaparecen al publicar con código geshi :¬¬

Cita de: Masita en 31 Diciembre 2009, 03:01 AM
Es una tonteria pero ese codigo no funcionaria.

¿Por que es una tontería? O te refieres a que el error es una tontería?
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Masita

Con lo de tonteria me referia a que es un fallo simple lo de dejarte una tabulacion, pero si lo haces nada va a funcionar.
En el cielo estan suspendidas las palabras que cantamos en nuestros sueños....

Novlucker

#5
Bueno, lo prometido es deuda CaronteGold, y como no me gusta deber a nadie :P ...

Código (python) [Seleccionar]
def Ttartaglia(levels):
aTar = [[1],[1,1]]
for i in range(2,levels):
aux = []
for e in range(1,i):
aux.append(aTar[i-1][e-1]+aTar[i-1][e])
aux = [1]+aux+[1]
aTar.append(aux)
return aTar

print("(a + b)^n")
a = int(input("Ingrese el primer valor, 'a': "),10)
b = int(input("Ingrese el segundo valor, 'b': "),10)
n = int(input("Ingrese potencia , 'n': "),10)
aux1 = 0

Resv = 0
form = ''

for v in Ttartaglia(n+1)[n]:
form += str(v)+"*"+str(a)+"^"+str(n-aux1)+"*"+str(b)+"^"+str(aux1)+" + "
Resv += v*(a**(n-aux1))*(b**aux1)
aux1 += 1

print("\nLa fórmula aplicada es la siguiente:\n"+form[:-3])
print("\nEl resultado es: "+str(Resv))


Lo he hecho directamente para fórmulas sin incógnitas.
Le he agregado una función que devuelve una lista conteniendo el triángulo de Tartaglia, a la cual hay que pasarle el número de filas que se quiere que tenga la lista (cuenta la cero)
Mejorando lo del triángulo es más sencillo tener un algorítmo claro y limpio, así que la suma y fórmulas finales también se pueden generar, y no van a mano como antes
Sería bueno que tuviese verificación de errores (ingreso de usuario), pero creo que con esto basta para darte ideas ;)

La salida:
(a + b)^n
Ingrese el primer valor, 'a': 5
Ingrese el segundo valor, 'b': 8
Ingrese potencia , 'n': 6

La fórmula aplicada es la siguiente:
1*5^6*8^0 + 6*5^5*8^1 + 15*5^4*8^2 + 20*5^3*8^3 + 15*5^2*8^4 + 6*5^1*8^5 + 1*5^0*8^6

El resultado es: 4826809
>>>


Prestame atención, sigue con lo básico, entiende bien los bucles y condicionales, luego te pasas a objetos (sockets por ejemplo)

Saludos ::)
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

CaronteGold

    Ahora miraré " def  y return, ", y el for, porque aún no lo he visto y no puedo entender bien el código xD.

   El código está hecho para Python 3.x ? no ¿? , es que lo miré en la 2.6 y me da error al ingresar un número en "a".
 
   Saludos.

Novlucker

Sumale a eso, mirar las listas

Exacto, Python 3.1, solo cambiale los input para el ingreso :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

CaronteGold

#8
Cita de: Novlucker en 31 Diciembre 2009, 20:10 PM
Sumale a eso, mirar las listas

Exacto, Python 3.1, solo cambiale los input para el ingreso :P

Saludos

   Listas las he mirado, no es que lo maneje bien, pero si las identifiqué en tu programa.