Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Tachikomaia en 24 Diciembre 2023, 07:01 am



Título: If vs Matemáticas ¿qué es mejor?
Publicado por: Tachikomaia en 24 Diciembre 2023, 07:01 am
Por ejemplo tengo:
Código
  1. if ( MaxLongitud>1 ) {
  2. set ("N"+(MaxLongitud+1), eval("N"+MaxLongitud)*10-1);
  3. } else {
  4. set ("N"+(MaxLongitud+1), 9);
  5. }
  6.  
Eso crea una variable cuyo valor debe ser 9, 99, 999, etc, según cuánto sea la variable MaxLongitud. Creo que se podría simplificar pero en mi lenguaje hacer potencias funciona mal parece. Pero eso no es la cuestión. La cuestión es que como no sé una fórmula matemática que en cualquier caso resulte los valores que necesito, usé un if. Yo necesitaría esto:
Si X (MaxLongitud) es 1, Y (el resultado) debe ser 9.
Si X es 2, Y debe ser 99.
etc.
Creo que es Y=10^X-1, pero como la potencia funciona mal no puedo hacer eso. Lo que hago es tomar el valor de una variable que en ese momento es +1 y luego /10, creo, o sea, cuando necesito asignar un 99, la variable anterior es 10, la cuestión es que le hago *10-1 y listo. El problema es la 1era vez. La 1era vez esa variable es 0, y si hago 0*10-1 no me da 9.

Yo supongo que hay alguna fórmula matemática que cumpla eso, y así no es necesario poner un if, y por curiosidad o manía o no sé qué quiero saber cual es la bendita fórmula, pero ¿conviene programar así usando fórmulas "complicadas" en vez de ifs, o conviene usar ifs? En este caso puse una fórmula, pero digo que sería posible poner una probablemente más compleja que sirva para ambos casos ¿pero conviene? ¿qué método enlentece menos a los programas?

Trato de evitar ifs porque con ellos la máquina debe hacer 2 cosas en vez de una, pero si la fórmula es muy larga puede que sea peor usarla.


Título: Re: If vs Matemáticas ¿qué es mejor?
Publicado por: Serapis en 28 Diciembre 2023, 17:11 pm
Es raro eso de que "la potencia funciona mal"... un lenguaje puede tener bugs, pero nunca tan evidentes que no fueran corregidos.

En cualquier caso, una potencia es una serie de mutiplicaciones, luego ejecuta un bucle.

Potencia              Bucle
---------------------------------------
10^0 =1
10^1 = 10    
10^2 = 100   ---->10x10
10^3 = 1000 ----> 10x10x10
10^4 = 10000 ----> 10x10x10x10
...

Al final restas 1 y ya tienes todos los 9...
los caso 0 y 1 puedes tratarlos en un 'else'

Código:
if n>= 2
  ...bucles
else
  ... los caso 0 y 1 se tratan aquí.
end if

p.d.: Más aún antes del bucle puede condicionarse para los casos 0 y 1. Aunque el código en ambos casos no difiere mucho en cuanto a la ncantidad de líneas de código...

Código:
x=1
bucle para k desde 1 hasta n
    x= (x * 10)
siguiente

devolver x-1


Título: Re: If vs Matemáticas ¿qué es mejor?
Publicado por: Tachikomaia en 29 Diciembre 2023, 07:26 am
Es raro eso de que "la potencia funciona mal"... un lenguaje puede tener bugs, pero nunca tan evidentes que no fueran corregidos.
Sí, pero mira:
https://foro.elhacker.net/programacion_general/iquestel_programa_dice_que_99999991_es_999999999999999-t520613.0.html
Digamos que el mío es viejito, pero aún así es raro sí.

Este tema es sobre qué es más eficiente, así que usar bucles no parece buena idea.

Esto que me dijeron en otro asunto me ha parecido muy interesante:
Citar
Si lo que te interesa es una función f(x) tal que f(1)=3 y f(2)=6 es muy sencillo. Si estás seguro de que la relación entre la variable dependiente y la independiente es lineal, sólo tienes que hallar la ecuación de la recta sabiendo dos puntos de la misma.

f(x)=ax+b

Si f(1)=3 ⟹ 3=a⋅1+b

Si f(2)=6 ⟹ 6=a⋅2+b

Para hallar el valor de los coeficientes sólo hay que resolver el sistema:

a+b=3
2a+b=6

a=3
b=0

f(x)=3x

Si en lugar de dos puntos de datos tienes tres, se procede de igual manera, sólo que en vez de dos parámetros a y b vas a tener tres y ya no es una recta (polinomio de grado 1) sino un polinomio de grado dos.

f(x)=ax^2+bx+c

Por ejemplo tenemos tres puntos f(1)=3, f(2)=6 y f(3)=13

Si f(1)=3 entonces 3=a⋅(1^2)+b⋅(1)+c

Si f(2)=6 entonces 6=a⋅(2^2)+b⋅(2)+c

Si f(3)=13 entonces 13=a⋅(3^2)+b⋅(3)+c

Resolviendo el sistema
a+b+c=3
4a+2b+c=6
9a+3b+c=13

a=2
b=−3
c=4

f(x)=2x^2−3x+4

Para cuatro puntos de dato, tienes una cúbica con cuatro paràmetros, etc.
Si las variables son 2, probablemente las fórmulas que se requieran sean de ese tipo, a veces simplificables. Si son 3 o más no sé, estoy averiguando.


Título: Re: If vs Matemáticas ¿qué es mejor?
Publicado por: profinet en 29 Diciembre 2023, 10:34 am
Matemáticamente hablando, la potenciación es una suma de sumas. No hay manera de resumir esta definición en otros términos. Verás...

Dado un conjunto N+ de números naturales (sin incluir el cero) y el grupo aditivo (N+,+), definimos la potenciación como una operación P:N+×N→N+ de la siguiente manera:

Código:
    1. Para n=0, P(a,0)=1 para cualquier a en N+.
    2. Para n>0, P(a,n)=∑[k=1,n]P(a,n−1).

Esta definición refleja la idea de que P(a,n) es la suma de n términos, cada uno de los cuales es P(a,n−1).

Veamos un ejemplo con esta definición. Consideremos a=2 y n=3.
Código:
P(2,3)=∑[k=1,3]P(2,2)

Entonces, en cada término del sumatorio, tenemos P(2,2):
Código:
P(2,3)=P(2,2)+P(2,2)+P(2,2)

Ahora, aplicamos la definición nuevamente para P(2,2):
Código:
P(2,2)=∑[k=1,2]P(2,1)

Lo que resulta en:
Código:
P(2,3)=P(2,1)+P(2,1)+P(2,1)+P(2,1)+P(2,1)+P(2,1)

Finalmente, aplicamos la definición para P(2,1):
Código:
P(2,1)=∑[k=1,1]P(2,0)

Que da como resultado:
Código:
P(2,3)=P(2,0)+P(2,0)+P(2,0)+P(2,0)+P(2,0)+P(2,0)+P(2,0)+P(2,0)

Y aplicando la definición final para P(2,0):
Código:
P(2,0)=1

Entonces, sumamos 1, 8 veces:
Código:
P(2,3)=1+1+1+1+1+1+1+1=8

Por lo tanto, P(2,3) = 2^3 = 8

Ahora bien, existen algoritmos que te permiten reducir el número de operaciones que debes realizar para calcular la potencia de un número: potenciación rápida. El algoritmo de exponenciación rápida se basa en la observación de que si se tiene que calcular a^n, donde n es par, puedes dividir el problema en dos partes más pequeñas: a^(n/2) y luego elevar el resultado al cuadrado. Si n es impar, puedes hacer lo mismo pero también multiplicar por a al final.

Aquí un pseudocódigo:

Código:
funcion potenciacion_rapida(a, n):
    si n == 0:
        devolver 1
    si n es par:
        mitad = potenciacion_rapida(a, n / 2)
        devolver mitad * mitad
    si n es impar:
        mitad = potenciacion_rapida(a, (n - 1) / 2)
        devolver a * mitad * mitad