Determinar las fracciones continuas de raíces cuadradas


13

La fracción continua de un número nes una fracción de la siguiente forma:


que converge a n.

La secuencia aen una fracción continua se escribe típicamente como: [a 0 ; un 1 , un 2 , un 3 , ... un n ].
Escribiremos el nuestro de la misma manera, pero con la parte repetida entre punto y coma.

Su objetivo es devolver la fracción continua de la raíz cuadrada de n.
Entrada: un entero, n. nNunca será un cuadrado perfecto.
Salida: La fracción continua de sqrt(n).

Casos de prueba:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

El código más corto gana. ¡Buena suerte!


1
¿La salida tiene que estar en el mismo formato que los casos de prueba?
grc

No. Mientras tengas los puntos y comas, está bien.
beary605

Hm, obteniendo las respuestas correctas, teniendo problemas para saber cuándo es racional detener la fracción. ¿Es realmente tan simple como cuando un <sub> 0 </sub> es el doble del sqrt de la entrada original?
JoeFish

Sí, ese es el límite.
beary605

@ beary605 gracias. He estado leyendo mucho más, y ahora veo que la fracción continua de una raíz cuadrada es un poco un caso especial. Cosas fascinantes! Todavía estoy trabajando en una versión sin coma flotante.
JoeFish

Respuestas:


3

GolfScript ( 66 60 caracteres)

~:^,{.*^>}?(:?';'[1?{^1$.*-@/?@+.2$/@@1$%?\- 1$(}do;;]','*1$

Advertencia: la mayor parte de ?allí son las variables que representan en floor(sqrt(input))lugar de las incorporadas. Pero el primero es el incorporado.

Toma entrada en stdin y salidas a stdout.

Psuedocódigo del algoritmo (prueba de corrección que actualmente se deja como ejercicio para el lector):

n := input()
m := floor(sqrt(n))
output(m)
x := 1
y := m
do
  x := (n - y * y) / x
  output((m + y) / x)
  y := m - (m + y) % x
while (x > 1)

Una vez más, me encuentro con ganas de un solo operador que toma a bla pila y se va a/b a%ben la pila.


1
Yo diría que realmente necesito aprender GS ... pero la necesidad es una palabra demasiado fuerte poco aquí;)
boothby

1
@ Boothby, no te vuelvas loco. Tu vida no estará completa sin GS;)
Peter Taylor

3

Python, 95 97 (pero correcto ...)

Esto usa solo aritmética de enteros y división de piso. Esto producirá resultados correctos para todas las entradas enteras positivas, aunque si se quiere usar un largo, tendrían que agregar un carácter; por ejemplo m=a=0L. Y, por supuesto ... espere un millón de años para que termine el piso de mi pobre hombre.

z=x=m=1
while n>m*m:m+=1
m=y=m-1
l=()
while-z<x:x=(n-y*y)/x;y+=m;l+=y/x,;y=m-y%x;z=-1
print c,l

Salida:

n=139
11 (1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22)

editar: ahora usando el algoritmo de Peter Taylor. Eso do...whilefue divertido


¿Para qué sirve *(c*c-n)?
Peter Taylor

@PeterTaylor, no había leído el desafío con suficiente cuidado e hice que el código funcionara para cuadrados perfectos.
Boothby

2

Pitón, 87 82 80

x=r=input()**.5
while x<=r:print"%d"%x+",;"[x==r],;x=1/(x%1)
print`int(r)*2`+";"

Toma un entero y da salida como:

4; 2, 1, 3, 1, 2, 8;

x-int(x) -> x%1. Estoy impresionado :)
beary605 18/06/12

Da el resultado incorrecto para √139 según Wolfram Alpha
breadbox

Lo actualicé para que funcione para √139. Sin embargo, si la longitud de la secuencia se hace mucho más larga (√139 tiene una secuencia de 18 números), entonces el resultado probablemente comenzará a perder precisión.
grc

Me parece increíblemente interesante que siempre termine en 2 * int (sqrt (a)).
beary605

Más interesante ahora es que 3 de nosotros tenemos un código roto para 139 (el mío todavía no está golfizado y no publicado).
JoeFish

2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

La salida está en formato de lista, que es más apropiada para Mathematica. Ejemplos:

c[2]
c[3]
c[19]
c[139]
c[1999]

(* out *)
{1, {2}}
{1, {1, 2}}
{4, {2, 1, 3, 1, 2, 8}}
{11, {1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22}}
{44, {1, 2, 2, 4, 1, 1, 5, 1, 5, 8, 1, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 
  1, 14, 3, 1, 1, 29, 4, 4, 2, 5, 1, 1, 17, 2, 1, 12, 9, 1, 5, 1, 43, 
  1, 5, 1, 9, 12, 1, 2, 17, 1, 1, 5, 2, 4, 4, 29, 1, 1, 3, 14, 1, 1, 
  1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 8, 5, 1, 5, 1, 1, 4, 2, 2, 1, 88}}

1
Oh hombre, esperaba totalmente esta respuesta. No lo consideraré como una respuesta real, a menos que usted mismo genere la fracción continua.
beary605

@ beary605 Bastante justo.
DavidC

2
+1 Mejor aún (25 caracteres)ContinuedFraction@Sqrt@#&
Dr. belisarius

¿Qué estás contando exactamente aquí? ¿Es este un programa que recibe información de stdin? Porque la forma en que lo usa parece que es un cuerpo de función sin la definición de la función.
Peter Taylor

@ Peter Taylor Por favor, vea la enmienda.
DavidC

1

Pitón ( 136 133 96)

El método estándar para fracciones continuas, extremadamente golfizado.

a=input()**.5
D=c=int(a);b=[]
while c!=D*2:a=1/(a%1);c=int(a);b+=[c]
print D,";%s;"%str(b)[1:-1]

Puede guardar algunos caracteres utilizando while 1:. También podría poner la mayoría de las declaraciones en el ciclo while en una sola línea.
grc

Cuando ejecuto su script, obtengo un resultado de 8 ;1;74 y 75; Eso no parece correcto. Se cuelga en 76.
breadbox

^^ Sí. Arreglado mi código.
beary605

Esta versión da el resultado incorrecto para 139.
breadbox

@boothby Luego eliminaré el mío y lo llamaremos un empate :)
JoeFish

1

C, 137

Incluyendo la nueva línea, suponiendo que no tenga que rodar mi propia raíz cuadrada.

#include<math.h>
main(i,e){double d;scanf("%lf",&d);e=i=d=sqrt(d);while(i^e*2)printf("%d%c",i,e^i?44:59),i=d=1.0/(d-i);printf("%d;",i);}

Se rompe para sqrt (139) y contiene el punto y coma extra ocasional en la salida, pero estoy demasiado cansado para trabajar más en él esta noche :)

5 5
2; 4;
19
4; 2,1,3,1,2,8;
111
10; 1,1,6,1,1,20;

1

Perl, 99 caracteres

No se arruina en 139, 151, etc. Probado con un número que varía de 1 a 9 dígitos.

$"=",";$%=1;$==$-=($n=<>)**.5;
push@f,$==(($s=$=*$%-$s)+$-)/($%=($n-$s*$s)/$%)until$=>$-;
say"$-;@f;"

Nota: $%, $=, y $-son todas las variables enteras de forzamiento.


1

APL (NARS), 111 caracteres, 222 bytes

r←f w;A;a;P;Q;m
m←⎕ct⋄Q←1⋄⎕ct←P←0⋄r←,a←A←⌊√w⋄→Z×⍳w=0
L: →Z×⍳0=Q←Q÷⍨w-P×P←P-⍨a×Q⋄r←r,a←⌊Q÷⍨A+P⋄→L×⍳Q>1
Z: ⎕ct←m

La función f se basa en el algo que se encuentra en la página http://mathworld.wolfram.com/PellEquation.html para resolver la ecuación de Pell. Esa función f tiene su entrada no todos los números negativos (tipo fracción también). Posible que algo salga mal, recuerdo que √ tiene, en mi opinión, un problema para los números de fracciones grandes, como

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

entonces habría una función sqrti (). Por esta razón, la entrada de fracción (y la entrada entera) tiene que ser <10 ^ 15. prueba:

 ⎕fmt (0..8),¨⊂¨f¨0..8
┌9───────────────────────────────────────────────────────────────────────────────────────────────────────┐
│┌2─────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────────────┐ ┌2─────────┐│
││  ┌1─┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌5─────────┐│ │  ┌3─────┐││
││0 │ 0││ │1 │ 1││ │2 │ 1 2││ │3 │ 1 1 2││ │4 │ 2││ │5 │ 2 4││ │6 │ 2 2 4││ │7 │ 2 1 1 1 4││ │8 │ 2 1 4│││
││~ └~─┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─────────┘2 │~ └~─────┘2│
│└∊─────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────────────┘ └∊─────────┘3
└∊───────────────────────────────────────────────────────────────────────────────────────────────────────┘
  f 19
4 2 1 3 1 2 8 
  f 54321x
233 14 1 1 3 2 1 2 1 1 1 1 3 4 6 6 1 1 2 7 1 13 4 11 8 11 4 13 1 7 2 1 1 6 6 4 3 1 1 1 1 2 1 2 3 1 1 14 466 
  f 139
11 1 3 1 3 7 1 1 2 11 2 1 1 7 3 1 3 1 22 
  +∘÷/f 139
11.78982612
  √139
11.78982612

si el argumento es un cuadrado de un número, devolvería una lista de 1 solo elemento, el sqrt de ese número

  f 4
2 

Si dependiera de mí, en un ejercicio sin "codegolf" preferiría la edición anterior que usa la función sqrti () ...


1
seguramente puede usar nombres de una letra en lugar de fqy a0. también: (a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨- ¿soporta nars Q÷⍨←?
ngn

@ngn: No me gusta usar "Q ÷ ⍨ ←" en una cadena de fórmula de asignación múltiple ... para el resto de acuerdo ... Posible Lo digo porque vi C Comportamiento indefinido
RosLuP
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.