[Question]
  [
It is ancient knowledge that every non-negative integer can be rewritten as the sum of four squared integers. For example the number 1 can be expressed as \$0^2+0^2+0^2+1^2\$. Or, in general, for any non-negative integer \$n\$, there exist integers \$a,b,c,d\$ such that
$$n = a^2+b^2+c^2+d^2$$
[Joseph-Louis Lagrange](https://pg-astro.fr/grands-astronomes/le-grand-siecle/joseph-louis-lagrange.html) proved this in the 1700s and so it is often called [Lagrange's Theorem](https://www.britannica.com/science/Lagranges-four-square-theorem).
This is sometimes discussed in relation to quaternions – a type of number discovered by [William Hamilton](https://www.maths.tcd.ie/pub/HistMath/People/Hamilton/) in the 1800s, represented as $$w+x\textbf{i}+y\textbf{j}+z\textbf{k}$$ where \$w,x,y,z\$ are real numbers, and \$\textbf{i}, \textbf{j}\$ and \$\textbf{k}\$ are distinct imaginary units that don't multiply commutatively. Specifically, it is discussed in relation to squaring each component of the quaternion $$w^2+x^2+y^2+z^2$$This quantity is sometimes called the [norm, or squared norm](https://math.stackexchange.com/questions/3174308/norm-of-quaternion), or also [quadrance](https://www.youtube.com/watch?v=g22jAtg3QAk). Some [modern proofs](https://www2.gwu.edu/~spwm/erin_alissa.pdf) of Lagrange's Theorem use quaternions.
[Rudolf Lipschitz](http://www-history.mcs.st-andrews.ac.uk/Biographies/Lipschitz.html) studied quaternions with only integer components, called Lipschitz quaternions. Using quadrance, we can imagine that every Lipschitz quaternion can be thought of having a friend in the integers. For example quaternion \$0+0\textbf{i}+0\textbf{j}+1\textbf{k}\$ can be thought of as associated with the integer \$1=0^2+0^2+0^2+1^2\$. Also, if we go backwards, then every integer can be thought of as having a friend in the Lipschitz quaternions.
But there is an interesting detail of Lagrange's theorem – the summation is not unique. Each integer may have several different sets of four squares that can be summed to create it. For example, the number 1 can be expressed in 4 ways using non-negative integers (let us only consider non-negatives for this challenge):
$$1=0^2+0^2+0^2+1^2$$
$$1=0^2+0^2+1^2+0^2$$
$$1=0^2+1^2+0^2+0^2$$
$$1=1^2+0^2+0^2+0^2$$
The summands are always squares of 0, or 1, but they can be in different positions in the expression.
For this challenge, let us also "sort" our summands lowest to highest, to eliminate duplicates, so that we could consider, for this exercise, that 1 only has one way of being represented as the sum of four squares:
$$1=0^2+0^2+0^2+1^2$$
Another example is the number 42, which can be expressed in four ways (again, only considering non-negative a,b,c,d, and eliminating duplicate component arrangements)
$$42=0^2+1^2+4^2+5^2$$
$$42=1^2+1^2+2^2+6^2$$
$$42=1^2+3^2+4^2+4^2$$
$$42=2^2+2^2+3^2+5^2$$
What if we imagine each of these different ways of expressing an integer as being associated to a specific quaternion? Then we could say the number 42 is associated with these four quaternions:
$$0+1\textbf{i}+4\textbf{j}+5\textbf{k}$$
$$1+1\textbf{i}+2\textbf{j}+6\textbf{k}$$
$$1+3\textbf{i}+4\textbf{j}+4\textbf{k}$$
$$2+2\textbf{i}+3\textbf{j}+5\textbf{k}$$
If we imagine the standard computer graphics interpretation of a quaternion, where \$\textbf{i}\$, \$\textbf{j}\$ and \$\textbf{k}\$ are vectors in three dimensional [Euclidean](https://play.google.com/books/reader?id=5lN1sy51SwYC&hl=en&pg=GBS.PA6) space, and so the \$x\$, \$y\$ and \$z\$ components of the quaternion are 3 dimensional [Cartesian](https://mathinsight.org/cartesian_coordinates) coordinates, then we can imagine that each integer, through this thought process, can be associated with a set of 3 dimensional coordinates in space. For example, the number 42 is associated with the following four \$(x,y,z)\$ coordinates: $$(1,4,5),(1,2,6),(3,4,4),(2,3,5)$$
This can be thought of as a point cloud, or a set of points in space. Now, one interesting thing about a set of finite points in space is that you can always draw a minimal bounding box around them – a box that is big enough to fit all the points, but no bigger. If you imagine the box as being an ordinary box aligned with the \$x,y,z\$ axes, it is called an [axis-aligned bounding box](https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection). The bounding box also has a volume, calculable by determining its width, length, and height, and multiplying them together.
We can then imagine the volume of a bounding box for the points formed by our quaternions. For the integer 1, we have, using the criteria of this exercise, one quaternion whose quadrance is 1, \$0+0\textbf{i}+0\textbf{j}+1\textbf{k}\$. This is a very simple point cloud, it only has one point, so it's bounding box has volume 0. For the integer 42, however, we have four quaternions, and so four points, around which we can draw a bounding box. The minimum point of the box is \$(1,2,4)\$ and the maximum is \$(3,4,6)\$ resulting in a width, length, and height of 2, 2, and 2, giving a volume of 8.
Let's say that for an integer \$n\$, the qvolume is the volume of the axis-aligned bounding box of all the 3D points formed by quaternions that have a quadrance equal to \$n\$, where the components of the quaternion \$w+x\textbf{i}+y\textbf{j}+z\textbf{k}\$ are non-negative and \$w<=x<=y<=z\$.
Create a program or function that, given a single non-negative integer \$n\$, will output \$n\$'s qvolume.
Examples:
```
input -> output
0 -> 0
1 -> 0
31 -> 4
32 -> 0
42 -> 8
137 -> 96
1729 -> 10032
```
This is code-golf, smallest number of bytes wins.
  
[Answer]
# [Wolfram Language (Mathematica)](https://www.wolfram.com/wolframscript/), ~~67~~ 58 bytes
```
Volume@BoundingRegion[Rest/@PowersRepresentations[#,4,2]]&
```
[Try it online!](https://tio.run/##HYuxCsMgFAD3fMWDQiYhjRFCh4LkC4JDFusg7cMK9VnU0KH0263tcMctF2y5Y7DFX211cIZL3eJjDyiXuNPNk1PofCStMJdBrvGFKSt8JsxIpW2Rsj4wwbgxfV2TpyKdFLzr/q3dIOF9ZDAymH5wBqIxTnPTzE8fU78 "Wolfram Language (Mathematica) – Try It Online")
```
                         ...&   Pure function:
PowersRepresentations[#,4,2]    Get the sorted reprs. of # as sums of 4 2nd powers
Rest/@                         Drop the first coordinate of each
BoundingRegion[...]            Find the bounding region, a Cuboid[] or Point[].
                               By default Mathematica finds an axis-aligned cuboid.
Volume                         Find volume; volume of a Point[] is 0.
```
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), 17 [bytes](https://github.com/DennisMitchell/jelly/wiki/Code-page)
```
Żœċ4²S⁼ɗƇ⁸ZḊṢ€I§P
```
**[Try it online!](https://tio.run/##AS4A0f9qZWxsef//xbvFk8SLNMKyU@KBvMmXxofigbha4biK4bmi4oKsScKnUP///zQy "Jelly – Try It Online")** (pretty slow - make it fast enough for all the test cases [with a leading `½`](https://tio.run/##y0rNyan8///Q3qO7j04@0m1yaFPwo8Y9J6cfa3/UuCPq4Y6uhzsXPWpa43loecD/w@1A1v//0YY6CsYgbKSjYALEhsbmQMLcyDIWAA "Jelly – Try It Online"))
### How?
```
Żœċ4²S⁼ɗƇ⁸ZḊṢ€I§P - Link: non-negative integer, n    e.g. 27
Ż                 - zero-range                            [0,1,2,...,27]
   4              - literal four                          4
 œċ               - combinations with replacement         [[0,0,0,0],[0,0,0,1],...,[0,0,0,27],[0,0,1,1],[0,0,1,2],...,[27,27,27,27]]
        Ƈ         - filter keep those for which:          e.g.: [0,1,1,5]
       ɗ          -   last three links as a dyad:
    ²             -     square (vectorises)                     [0,1,1,25]
     S            -     sum                                     27
      ⁼  ⁸        -     equal to? chain's left argument, n      1
                  -                                       -> [[0,1,1,5],[0,3,3,3],[1,1,3,4]]
          Z       - transpose                             [[0,0,1],[1,3,1],[1,3,3],[5,3,4]]
           Ḋ      - dequeue                               [[1,3,1],[1,3,3],[5,3,4]]
            Ṣ€    - sort each                             [[1,1,3],[1,3,3],[3,4,5]]
              I   - incremental differences (vectorises)  [[ 0,2 ],[ 2,0 ],[ 1,1 ]]
               §  - sum each                              [2,2,2]
                P - product                               8
```
[Answer]
# [Haskell](https://www.haskell.org/), ~~132~~ 123 bytes
```
z=zipWith
(!)=foldr1.z
h n=[0..n]
f n|p<-[[c,b,a]|a<-h n,b<-h a,c<-h b,d<-h c,a^2+b^2+c^2+d^2==n]=product$z(-)(max!p)$min!p
```
[Try it online!](https://tio.run/##ZYrRCoIwFIbvfYojeKG0iVoghXuArroRuhCFuSWOdBvTKIbvbhoEYQd@Pv7vPy0d7reum2dLrNBXMbaO7wakUR03cWidFiQpojCUpdOAnHSGi4KhGtFyohleVlSvoIitqBFfwRCtkl29hC3hVUKILIk2ij/Y6FkfB35PX64OvF5IV889FZJw5cBy2gg5ggcNRJseb/r@TyQbcdiKeJ9@DMaQKwVDp57QKAP5@QIn/zv9/KfJcX4D "Haskell – Try It Online")
Pretty straightforward solution. Brute force all the possible solutions by iterating over all the values from 0 to n (way overkill but shorter bytecount). I output the point as a list so we can use @Lynn's magic `(!)` operator. That operator collapses each dimension with the function on the left side so `max!p` returns a list of size 3 which consists of the maximums along each dimension and `min!p` does the same for minimum. Then we just find the minimum size in each dimension (by subtracting the min value from the max with `z(-)`) and multiply them together.
Thanks a lot to @Lynn for taking off 9 bytes with some folding zip magic!
[Answer]
# [Sledgehammer](https://github.com/tkwa/Sledgehammer) 0.2, 12 bytes
```
⡌⢎⣟⡊⢘⣚⡏⡨⠍⠁⡇⠨
```
Use with Mathematica 11.2 and [this version](https://github.com/tkwa/Sledgehammer/tree/137f71a5e3f4ddd8d008f0811e3d1d3bea7ebb5e) of Sledgehammer, which predates the challenge. See edit history for a version that works in version 0.3, which has a GUI and generates a Mathematica expression.
This pushes the input to the stack and calls the sequence of commands
```
{intLiteral[4], intLiteral[2], call["PowersRepresentations", 3], call["Thread", 1], call["Rest", 1], call["Thread", 1], call["BoundingRegion", 1], call["Volume", 1]}
```
which is equivalent to evaluating the following Wolfram code derived from my [Wolfram Language answer](https://codegolf.stackexchange.com/a/186161/39328):
```
Volume[BoundingRegion[Thread@Rest@Thread@PowersRepresentations[#, 4, 2]]]&
```
[Try it online!](https://tio.run/##LY29CoMwFEZ3n@JCoVOgVQvSghB8ArE/S5oh6CUGNJHkSofSZ09j6XAOZ/jgmxWNOCsyvYp3u3hH2BO/To6yTULCpYZf5TLTUMMzPty0zigat9rBWN2hNs6K2@hRDbzDQPzfrXuhDx0uHgNaSifOBrFjcGJQSCn3sfXGktAHDu8jg5xBuVGkRSIvq6SqOH9k/AI "Wolfram Language (Mathematica) – Try It Online")
[Answer]
# [Python 2](https://docs.python.org/2/), 138 bytes
```
q=lambda n,x=0,*t:[t]*(n==0)if t[3:]else q(n-x*x,x,x,*t)+q(n,x+1,*t+(0,)*(x>n))
p=1
for l in zip(*q(input()))[:3]:p*=max(l)-min(l)
print p
```
[Try it online!](https://tio.run/##FY5BCoMwFET3OUVw9X@MkGihEEgvIi5sGzEQv9GmNO3lbWQG3rzdxG@aV2qPz@yD49q47B5VVR2bDeNyf46cZLZKimT6NAggaxX6iae@M4MLL8c3oCaLLM@IhHVxmWtddg1KooB8I0QWrWbTuvPAPfGfjyA28BTfCRCxN91gorDLmCFgs3gqYHH3lHg8zjuKadaVtuzSMt1d/w "Python 2 – Try It Online")
Recursively generates the reverse-sorted quaternions with the given norm, then takes the product between the max and min of all possible values in the first three indices.
`itertools` might have had a shot if it didn't use ridiculously long names like `itertools.combinations_with_replacement`
**[Python 2](https://docs.python.org/2/), 161 bytes**
```
from itertools import*
n=input();p=1
for l in zip(*[t[1:]for t in combinations_with_replacement(range(n+1),4)if sum(x*x for x in t)==n]):p*=max(l)-min(l)
print p
```
[Try it online!](https://tio.run/##FY5RCsIwEAX/c4qlX0lVMFUQKjmJiNSS2oVks6RbjF6@GngwMDDw@CNzom57zxg82N4XPzZNs005RUDxWVIKC2DklKVV5JB4FW2u7KyaUoYASPBF1u1Nbra/VyfVjSk@kQbBRMvjjTI/sucwjD56Ep0HenlNO2v2Z4MTLGvUpS1Q81JzMc7R3fTcujgUHcwhIv2hOCMJ8FZfHpVVp/86de6UPV1@ "Python 2 – Try It Online")
This is why [`itertools` is never the answer](https://codegolf.meta.stackexchange.com/a/5603/20260).
[Answer]
# JavaScript (ES6), ~~148~~ 143 bytes
```
n=>(r=[[],[],[]]).map(a=>p*=a.length+~a.indexOf(1),(g=(s,k=0,a=[])=>a[3]?s||r.map(r=>r[a.pop()]=p=1):g(s-k*k,k,[...a,++k],k>s||g(s,k,a)))(n))|p
```
[Try it online!](https://tio.run/##fcxBbsIwEIXhfU/hpYc4Jk5QKUjjHqEHsLwYQWKoU9uyEeoi6tXTlgVIICG93af/fdKZyi4f06kOcd/PA84BNc9ojBWXWZBflDihTgskOfbBnQ7VD8lj2PffHwNXILhDXoTHRhAaC6jJdPa9TFO@tBl1NiRTTBwsJlSwdbzUfuGFF0ZKSaKqvBVe/yXu/0kQAPAAMKV5F0OJYy/H6PjAGWMNAFsuWa1Z8/KA6gl2N1w9YvukXN3w7R5Vt77i5vVO1brdXFU1TdfOvw "JavaScript (Node.js) – Try It Online")
## Commented
We initialize an array \$r\$ with 3 empty arrays.
```
r = [ [], [], [] ]
```
For each valid value of \$x\$, we will set to \$1\$ the value at \$x+1\$ in the first array. Ditto for \$y\$ and \$z\$ with the 2nd and 3rd arrays respectively.
The dimensions of the bounding box will be deduced from the distance between the first and the last entry set to \$1\$ in these arrays.
### Step 1
To fill \$r\$, we use the recursive function \$g\$.
```
g = (              // g is a recursive function taking:
  s,               // s   = current sum, initially set to the input n
  k = 0,           // k   = next value to be squared
  a = []           // a[] = list of selected values
) =>               //
  a[3] ?           // if we have 4 values in a[]:
    s ||           //   if s is equal to zero (we've found a valid sum of 4 squares):
      r.map(r =>   //     for each array r[] in r[]:
        r[a.pop()] //       pop the last value from a[]
        = p = 1    //       and set the corresponding value in r[] to 1
                   //       (also initialize p to 1 for later use in step 2)
      )            //     end of map()
  :                // else:
    g(             //   do a recursive call:
      s - k * k,   //     subtract k² from s
      k,           //     pass k unchanged
      [...a, ++k], //     increment k and append it to a[]
      k > s ||     //     if k is less than or equal to s:
        g(s, k, a) //       do another recursive call with s and a[] unchanged
    )              //   end of outer recursive call
```
### Step 2
We can now compute the product \$p\$ of the dimensions.
```
r.map(a =>         // for each array a[] in r[]:
  p *=             //   multiply p by:
    a.length +     //     the length of a[]
    ~a.indexOf(1)  //     minus 1, minus the index of the first 1 in a[]
) | p              // end of map(); return p
```
[Answer]
# [C# (Visual C# Interactive Compiler)](http://www.mono-project.com/docs/about-mono/releases/5.0.0/#csc), 229 bytes
```
a=>{uint b=0,c=~0U,d,e,f=0,g=0,h=0,i=c,j=c,k=c;for(;b*b<=a;b++)for(c=b;c*c<=a;c++)for(d=c;d*d<=a;d++)for(e=d;e*e<=a;e++)if(b*b+c*c+d*d+e*e==a){f=c>f?c:f;g=d>g?d:g;h=e>h?e:h;i=c<i?c:i;j=d<j?d:j;k=e<k?e:k;}return(f-i)*(g-j)*(h-k);}
```
[Try it online!](https://tio.run/##Zc49b4QwDAbgvb@iYwJBuo9Kp2Ictk5dq87gOCRE4iQOptP1r1NHuqVlsBU/rxOFbhXd4vaxTtSscVpMbtbj1qG95/NrjwdD@HP4Ms6w8TINUkEqIplRKiGBv84K@qJvsIO@LHWeCXuggjLRk5ysusJlck9idMAFZ2Kh6JU8U8q9UhZLSRA7ffdI1rdUexjQ2aF19QAB2YaW6wDykyZKGmFE14ySjpCQmyRpgsfMyzpPyldRF2qoRumhShoeG7x8z3Hhzzix8uqo9V847@X0X952cjxfdnQ5vYttvw "C# (Visual C# Interactive Compiler) – Try It Online")
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E), 18 bytes
```
Ý4ãʒnOQ}€{ζ¦ε{¥O}P
```
[Try it online!](https://tio.run/##ASgA1/9vc2FiaWX//3TDnTTDo8qSbk9RfeKCrHvOtsKmzrV7wqVPfVD//zQy "05AB1E – Try It Online")
Port of [Jonathan Allan's Jelly answer](https://codegolf.stackexchange.com/a/186153/6484).
[Answer]
# [Haskell](https://www.haskell.org/), 104 bytes
```
n%i=(-).maximum<*>minimum$[t!!i|t<-mapM(:[0..n])[0..3],sum(map(^2)t)==n,scanr1 max t==t]
f n=n%0*n%1*n%2
```
[Try it online!](https://tio.run/##FYxBCoMwFET3PcUXFBKJYlQoFNMb9ASSQhBtg/5PMBG66NmbxsXjDcMwb@PXedtipMIqVvEazcfigUN5R0tnyseQZfYbhgqNe7Db2NQ1aX6q08IfyFLPni0PXCkSfjK0S0g3EJQK@rIAKSqakgqZaCMaS6DA7ZYC5GnoYEkOZp2hT2FsBEgB3UkroE/I7qrjb1o28/Kxmpz7Aw "Haskell – Try It Online")
*Thanks to Delfad0r for -1 byte and Lynn for 3 bytes*
To multiply the three dimensions, it turns out shortest to just write the product `f n=n%0*n%1*n%2` than to use any sort of loop. Here, `n%i` is the difference between the min and max of the `i`'th coordinate values, which are extracted with indexing `!!i`.
To generate the valid four-tuples, we take lists of four numbers from `[0..n]` whose squares sum to `n` and are in decreasing order. We check the reverse-sortedness of `t` with `scanr1 max t==t`, which sees if the running maximum of the reverse is itself, as Haskell doesn't have a built-in sort without a costly import. I tried various ways to recursively generate the four-tuples like in my Python answers, but they were all longer than this brute-force generate-and-filter way.
[Answer]
# [jq](https://stedolan.github.io/jq/), 164 bytes
```
. as$i|[range(.)]|[combinations(4)|select(map(.*.)|add==$i)|sort]|unique|[transpose[1:][]|sort|[.[:-1],.[1:]]|transpose|map(.[1]-.[0])|add//0]|reduce.[]as$j(1;.*$j)
```
[Try it online!](https://tio.run/##PY5BCoMwEEWv0oWLROpoSqFg8STDLFIdSqQmmsTd3D21Lrr97/N481YKXGyqnGC0/s0KNAmOYXk5b7MLPqm7lsQfHrNa7KqgBi12moahcgcIMZPs3m07C@ZDkdaQGE1PSCcVBOwbQ1f4jST/j5w2NNQAdnQ627YjiTztIwPSUTUr84S6mnUpt8cX "jq – Try It Online")
The pairwise reduction can probably be better. For lower numbers, null is substituted with `0` for consistent output.
Idea from Jonathan Allan's answer.
-1 from ovs.
]