Determining the continued fractions of square roots
GolfScript (66 60 chars)
~:^,{.*^>}?(:?';'[1?{^1$.*-@/?@+.2$/@@1$%?\- 1$(}do;;]','*1$
Warning: most of the ?
in there are the variable representing floor(sqrt(input))
rather than the builtin. But the first one is the builtin.
Takes input on stdin and outputs to stdout.
Psuedocode of the algorithm (proof of correctness currently left as an exercise for the reader):
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)
Yet again I find myself wanting a single operator which takes a b
on the stack and leaves a/b a%b
on the stack.
Python, 95 97 (but correct...)
This uses only integer arithmetic and floor division. This will produce correct results for all positive integer inputs, though if one wants to use a long, they'd have to add a character; for example m=a=0L
. And of course... wait for a million years for my poor man's floor sqrt to terminate.
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
Output:
n=139
11 (1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22)
edit: now using Peter Taylor's algorithm. That do...while
was fun.
Python, 87 82 80
x=r=input()**.5
while x<=r:print"%d"%x+",;"[x==r],;x=1/(x%1)
print`int(r)*2`+";"
It takes one integer and gives output like:
4; 2, 1, 3, 1, 2, 8;