// ========================================================= //
//                                                           //
//   File      : triangular.h                                //
//   Purpose   : provide sums of small powers                //
//                                                           //
//   Coded by Ralf Westram (coder@reallysoft.de) in Nov 21   //
//   http://www.arb-home.de/                                 //
//                                                           //
// ========================================================= //

#ifndef TRIANGULAR_H
#define TRIANGULAR_H

#ifndef CXXFORWARD_H
#include "cxxforward.h"
#endif

CONSTEXPR_INLINE long triangular_number(const long N) {
    // in german aka "Gausssche Summenformel"
    // SUM(k=[1..N]; k)
    return N*(N+1)/2;
}

CONSTEXPR_INLINE long squarepyramidal_number(const long N) {
    // in german aka "Quadratische Pyramidalzahl"
    // SUM(k=[1..N]; k^2)
    return N*(N+1)*(2*N+1)/6;
}

CONSTEXPR_INLINE long sum_of_triangular_numbers(const long L) {
    // SUM(N=[1..L]; SUM(k=[1..N]; k))
    return (squarepyramidal_number(L) + triangular_number(L)) / 2;
}

#else
#error triangular.h included twice
#endif // TRIANGULAR_H
