7 votos

Algoritmo para tetration trabajar con números de punto flotante

Hasta ahora, he descubierto un algoritmo para tetration que funciona.

Sin embargo, a pesar de la variable a puede ser flotante o entero, por desgracia, la variable b debe ser un número entero.

¿Cómo puedo modificar el algoritmo para que tanto a y b pueden ser números de punto flotante y la respuesta correcta será producido?

// Hyperoperation type 4:
public double tetrate(double a, double b)
{
    double total = a;
    for (int i = 1; i < b; i++) total = pow(a, total);
    return total;
}

En un intento de solucionar esto, he creado mi propio poder personalizado() función (tratando de evitar raíces, y las funciones de registro), y luego con éxito generalizado a la multiplicación. Desafortunadamente, cuando me intente generalizar a tetration, los números van en forma de pera.

Me gustaría un algoritmo para ser precisos hasta x cantidad de decimales, y no una aproximación como la Wikipedia habla.

2voto

Jorrit Reedijk Puntos 129

Cuando estudié los diversos conocido matrices de combinatorical números también miraba la siguiente idea: ¿y si hablamos de funciones con un conjunto de resultados, no sólo un número? Así, por ejemplo, el concepto de seno y coseno se pone un especial encanto si nos fijamos no sólo en f(x) = sin(x), g(x)=cos(x), pero en 2x2-matrices que contienen cos() y sin() y la entrada de la matriz de multiplicaciones tiene dos parámetros y el resultado así. Esto ayuda mucho a entender el álgebra con números complejos, por ejemplo.
Después de que pensé: ¿y si nos fijamos en las matrices que permiten no sólo mirar a una función de $f(x)=a_0 + a_1x + a_2x^2 + a_3x^3 + ...$ la participación de todos los poderes de $x$ como entrada, sino también de escupir todos los poderes de $f(x)$, de la misma manera. A continuación, por ejemplo

$$ V(x) \cdot P = V(x+1) $$ donde $V(x)$ significa que el vector $V(x)=[1,x,x^2,x^3,x^4,...]$ $P$ significa que la parte superior triangular de la matriz de Pascal. De curso $$(V(x) \cdot P )\cdot P = V(x+2)$$ y, por supuesto, es fácil ver que $$V(x) \cdot P^h = V(x+h)$$ first for integral powers of $P$ que cualquier programador puede implementar - y si se descarga Pari/GP que sólo puede utilizar la matriz de lenguaje.
Se necesita un cierto ingeniosa mente para averiguar cómo definir fraccional poderes de $P$ hacer que las fracciones de la operación de adición posible...

Después de que uno puede encontrar, que de un muy conocido combinatorical matriz $B$ realiza $$ V(x) \cdot B = V(exp(x))$$
y lógicamente $$ V(x) \cdot B^h = V(exp^{oh}(x))$$
para un entero $h$ -, pero, lo que significa que la implementación de tetration a entero itera $h$.
Para encontrar ahora las fracciones-h de energía de $B$ -cual es tu pregunta - no es tan simple, y el uso de matrices significa, prácticamente, para truncar a un tamaño finito.

Bueno, de todos modos significativos aproximaciones se puede hacer y versiones truncadas de $B$ puede ser diagonalized y los poderes generales que se pueden encontrar simplemente informática de las facultades generales en cada uno de los escalares de los números de la diagonal - y así uno puede introducir fracciones de poderes de $B$ en la fórmula $$ V_{32}(x) \cdot B_{32x32}^h \approx V_{32}(exp^{oh}(x))$$
(para por ejemplo, $32$ $32x32$ tamaño de los vectores y de la matriz) y se aplica de este modo, a continuación, la fracción de la iteración de la exponencial, también conocido como tetration.

Las matrices $P$ $B$ de la que estoy hablando, aquí se conoce como "Carleman-matrices" y todo este concepto puede ser aplicado a las fracciones de la iteración de muchas de las funciones para los que tienen una potencia de serie. (Bueno, vamos a tener problemas de convergencia y mucho más complicación y no unicidad y lo que no - pero ese no es el foco de esta respuesta)
Así que el uso de "mateigen" en Pari/GP para la diagonalización permite a los siguientes Pari/GP código de:

n=32
V(x,dim=n) = vector(dim,r,x^{r-1})      \\ define the function for generating V(x)
b = sqrt(2)
bl = log(b)
B = matrix(n,n,r,c,bl^(r-1)*(c-1)^(r-1)/(r-1)!)  \\ define the Carlemanmatrix 
    \\ for   V(x) * B = V(b^x) 
Y = V(1) * B  \\ in Y we'll have approximately V(b^x) 
    \\where the first two entries have the best approximation to the expected
    \\ value
    \\ now diagonalize
M = mateigen(B) \\ needs high precision of say 800 or 1600 digits for all operations
W = M^-1 
D = diag(W*B*M) 
   \\ after this we can do B^h = M * D^h * W 
   \\  and  D^h can be done by d_k,k^h on the elements of the diagonal
dpow(A,h=1)= for (r=1,#A, A[r,r]=A[r,r]^h);return(A) \\ define a function for powers of D      

BPow (h)= M*dpow(D,h)*W  \\ define a function for the fractional power of B

\\ after this we can do
Y = V(1) * BPow(0.5) 
\\ and have in Y[2] a nice approximation for the half-iterate or b^^0.5
\\where b=sqrt(2)

Me quieres experimentar con esto que me recomienda el uso de la dimensión de $n=16$ primera (con mucho más pobres aproximación), pero ya tendrás default(realprecision,200) o así. A ¿ mateigen de la matriz $B$ del tamaño de la $32x32$ uno debe calcular $b$, $bl$, $B$ y así sucesivamente ya que aun $1600$ o $2000$ interna dígitos de precisión y el mateigen puede necesitar varios minutos para completar. He intentado también con el tamaño de la $n=64 $ y esto fue realmente una completa tarde de cálculo... pero es un buen ejercicio de todos modos.


Comentario: he discutido esto un poco en el tetrationforum y han hecho un artículo en el que compara un par de esos ingenuos enfoques fraccional exponencial de las torres. El método anterior he llamado allí "polinomio de aproximación" porque el uso de finito matrices sin tomar cuidado para la compatibilidad con la teóricamente infinito del tamaño de las matrices y sus fracciones de poderes significa involucrar a los polinomios para que aproximados soluciones. Ver el índice y el enlace para el ensayo

0voto

Anthony M. Powers Puntos 693

Siento que esto es más de un técnicas de programación pregunta que cualquier otra cosa, ya que las cuestiones acerca de la conversión del tipo de datos. Así que usted quiere convertir float a int. Así que aquí está mi código sugerido (esto debería funcionar. Si no, dime y voy a editar este):

// Hyperoperation type 4: public double tetrate(double a, double b) { double total = a; int coefficient = 0; for (int i = 1; i <= b; i++) { total = pow(a, total); coefficient = i; } total = pow(b-double(coefficient), total); return total; }

Como se puede ver, he añadido un (int) declaración antes de la b variable. Esto se llama una fundición. Se trata de que el doble como un entero.

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