exponentiation

Grains
Grains in JavaScript

Exponentiation

export function square(num) {
  if (num < 1 || num > 64) {
    throw new Error('square must be between 1 and 64');
  }
  return 2n ** BigInt(num - 1);
}

export function total() {
  return 2n ** 64n - 1n;
}

JavaScript uses the exponential operator to raise a number by a certain exponent. Math.pow() can also be used to raise a number by an exponent, but it does not work with a BigInt.

Exponentiation is nicely suited to the problem, since we start with one grain and keep doubling the number of grains on each successive square. 1 grain is 2n ** 0, 2 grains is 2n ** 1, 4 is 2n ** 2, and so on.

Note

Note that a BigInt literal can be specified by appending n to the value.

So, to get the right exponent, we subtract 1 from the square number num.

The easiest way to get total is to get the value for an imaginary 65th square, and then subtract 1 from it. To understand how that works, consider a board that has only two squares. If we could grow the board to three squares, then we could get the number of grains on the imaginary third square, which would be 4. You could then subtract 4 by 1 to get 3, which is the number of grains on the first square (1) and the second square (2). Remembering that the exponent must be one less than the square you want, you can call 2n ** 64 to get the number of grains on the imaginary 65th square. Subtracting that value by 1 gives the values on all 64 squares.

Shortening

When the body of a function is a single expression, the function can be implemented as an arrow function, like so

export const total = () => 2n ** 64n - 1n;

Notice that return and the curly braces are not needed.

4th Sep 2024 · Found it useful?