# The square root of the square root of the square root of the…

## APL (Dyalog Unicode), 39 bytes

+/⊢{∨/⍺⍵<⍵0:0⋄⍺=0:1⋄+/∊∇¨/⍺(⍵*2)-⊂⍳⍺}¨⍳


Try it online!

A tacit function containing an inner dfn to use recursion. Does not use floating point numbers at all.

### How it works

First of all, observe that

$$\displaystyle \sqrt{a_1+\sqrt{a_2 + \cdots + \stackrel{\vdots}{\sqrt{a_t}}}} \le \cdots \le \sqrt{a_1+a_2 + \cdots + a_t} \le a_1+a_2 + \cdots + a_t = n$$

and this holds for all suffixes of any given sequence of positive integers.

Let's define a function $$\f(x,y)\$$ as the number of sequences where the sum is $$\x\$$ and the "root sum" is $$\y\$$. Then the following holds:

\begin{align} f(0, 0) &= 1 \\ f(0, y) &= 0, \qquad 0 < y \\ f(x, y) &= 0, \qquad x < y \text{ or } y < 0 \\ f(x, y) &= \sum_{i=1}^{x}{f(x-i, y^2-i)} \end{align}

Then the desired result is the sum $$\\sum_{i=1}^{n}{f(n,i)}\$$.

## Python 3, 67 bytes

This builds all sequences that sum to $$\n\$$ and slightly higher and counts those that exactly sum to $$\n\$$.

f=lambda n,k=0:(n==0)+sum(f(n-d*d+k,d)for d in range(n-~k)if d*d>k)


Try it online!

This approach is based on the observation that $$\\sqrt x\$$ can only be an integer if $$\x\$$ is an integer. This means, when building a sequence right to left, we always have to make sure to complete to a perfect square.

At every step $$\\sqrt{a_i+k}\$$, $$\a_i+k = d^2\$$ for some positive $$\d\$$ with $$\0 \lt d^2-k \le n'\$$, where $$\n'\$$ is the remaining integer at the current step. To check every possible square, $$\d\$$ needs to be tested up to $$\\lfloor\sqrt{n'+k}\rfloor\ \le n+k\$$.

In the code we count the number of times $$\n'=0\$$ is exactly reached, by summing all results and adding n==0. If n gets negative, range(n-~k) will eventually be empty, which will cause the recursion to stop.

This seems to be currently the fastest approach, and with some added memoization this gets really fast: First 1000 values

With a small modification the sequences can be printed:

f=lambda n,k=0,*a:(n==0!=print(a))+sum(f(n-d*d+k,d,d*d-k,*a)for d in range(n-~k)if d*d>k)


Try it online!

## Wolfram Language (Mathematica), 56 50 bytes

If[a=##-i i;0<a<#,a~#0~i,[email protected]]~Sum~{i,√+##}&


Try it online!