// -*- C++ -*-

// ===== FUNCTIONS declared in include/fxt.h: =====
// ... matching "walsh"


// ----- SRCFILE=walsh/walshdif2.cc: -----
void dif2_walsh_wak(double *f, ulong ldn);
// transform wrt. to walsh-kronecker basis (wak-functions)
// the basis: (sequency at end of lines, '*':=1, ' ':=-1)
// 0: [* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] ( 0)
// 1: [*   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *  ] (31)
// 2: [* *     * *     * *     * *     * *     * *     * *     * *    ] (15)
// 3: [*     * *     * *     * *     * *     * *     * *     * *     *] (16)
// 4: [* * * *         * * * *         * * * *         * * * *        ] ( 7)
// 5: [*   *     *   * *   *     *   * *   *     *   * *   *     *   *] (24)
// 6: [* *         * * * *         * * * *         * * * *         * *] ( 8)
// 7: [*     *   * *   *     *   * *   *     *   * *   *     *   * *  ] (23)
// 8: [* * * * * * * *                 * * * * * * * *                ] ( 3)
// 9: [*   *   *   *     *   *   *   * *   *   *   *     *   *   *   *] (28)
//10: [* *     * *         * *     * * * *     * *         * *     * *] (12)
//11: [*     * *     *   * *     * *   *     * *     *   * *     * *  ] (19)
//12: [* * * *                 * * * * * * * *                 * * * *] ( 4)
//13: [*   *     *   *   *   * *   *   *   *     *   *   *   * *   *  ] (27)
//14: [* *         * *     * * * *     * *         * *     * * * *    ] (11)
//15: [*     *   * *     * *   *     * *     *   * *     * *   *     *] (20)
//16: [* * * * * * * * * * * * * * * *                                ] ( 1)
//17: [*   *   *   *   *   *   *   *     *   *   *   *   *   *   *   *] (30)
//18: [* *     * *     * *     * *         * *     * *     * *     * *] (14)
//19: [*     * *     * *     * *     *   * *     * *     * *     * *  ] (17)
//20: [* * * *         * * * *                 * * * *         * * * *] ( 6)
//21: [*   *     *   * *   *     *   *   *   * *   *     *   * *   *  ] (25)
//22: [* *         * * * *         * *     * * * *         * * * *    ] ( 9)
//23: [*     *   * *   *     *   * *     * *   *     *   * *   *     *] (22)
//24: [* * * * * * * *                                 * * * * * * * *] ( 2)
//25: [*   *   *   *     *   *   *   *   *   *   *   * *   *   *   *  ] (29)
//26: [* *     * *         * *     * *     * *     * * * *     * *    ] (13)
//27: [*     * *     *   * *     * *     * *     * *   *     * *     *] (18)
//28: [* * * *                 * * * *         * * * * * * * *        ] ( 5)
//29: [*   *     *   *   *   * *   *     *   * *   *   *   *     *   *] (26)
//30: [* *         * *     * * * *         * * * *     * *         * *] (10)
//31: [*     *   * *     * *   *     *   * *   *     * *     *   * *  ] (21)
// self-inverse

void dif2_walsh_wal(double *f, ulong ldn);
// transform wrt. to walsh-kaczmarz basis (wal-functions)
// the basis: (sequency at end of lines, '*':=1, ' ':=-1)
// 0: [* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] ( 0)
// 1: [* * * * * * * * * * * * * * * *                                ] ( 1)
// 2: [* * * * * * * *                                 * * * * * * * *] ( 2)
// 3: [* * * * * * * *                 * * * * * * * *                ] ( 3)
// 4: [* * * *                 * * * * * * * *                 * * * *] ( 4)
// 5: [* * * *                 * * * *         * * * * * * * *        ] ( 5)
// 6: [* * * *         * * * *                 * * * *         * * * *] ( 6)
// 7: [* * * *         * * * *         * * * *         * * * *        ] ( 7)
// 8: [* *         * * * *         * * * *         * * * *         * *] ( 8)
// 9: [* *         * * * *         * *     * * * *         * * * *    ] ( 9)
//10: [* *         * *     * * * *         * * * *     * *         * *] (10)
//11: [* *         * *     * * * *     * *         * *     * * * *    ] (11)
//12: [* *     * *         * *     * * * *     * *         * *     * *] (12)
//13: [* *     * *         * *     * *     * *     * * * *     * *    ] (13)
//14: [* *     * *     * *     * *         * *     * *     * *     * *] (14)
//15: [* *     * *     * *     * *     * *     * *     * *     * *    ] (15)
//16: [*     * *     * *     * *     * *     * *     * *     * *     *] (16)
//17: [*     * *     * *     * *     *   * *     * *     * *     * *  ] (17)
//18: [*     * *     *   * *     * *     * *     * *   *     * *     *] (18)
//19: [*     * *     *   * *     * *   *     * *     *   * *     * *  ] (19)
//20: [*     *   * *     * *   *     * *     *   * *     * *   *     *] (20)
//21: [*     *   * *     * *   *     *   * *   *     * *     *   * *  ] (21)
//22: [*     *   * *   *     *   * *     * *   *     *   * *   *     *] (22)
//23: [*     *   * *   *     *   * *   *     *   * *   *     *   * *  ] (23)
//24: [*   *     *   * *   *     *   * *   *     *   * *   *     *   *] (24)
//25: [*   *     *   * *   *     *   *   *   * *   *     *   * *   *  ] (25)
//26: [*   *     *   *   *   * *   *     *   * *   *   *   *     *   *] (26)
//27: [*   *     *   *   *   * *   *   *   *     *   *   *   * *   *  ] (27)
//28: [*   *   *   *     *   *   *   * *   *   *   *     *   *   *   *] (28)
//29: [*   *   *   *     *   *   *   *   *   *   *   * *   *   *   *  ] (29)
//30: [*   *   *   *   *   *   *   *     *   *   *   *   *   *   *   *] (30)
//31: [*   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *  ] (31)
// the wal functions are sequency- ordered
// self-inverse

void dif2_walsh_pal(double *f, ulong ldn);
// transform wrt. to walsh-paley basis (pal-functions)
// the basis: (sequency at end of lines, '*':=1, ' ':=-1)
// 0: [* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] ( 0)
// 1: [* * * * * * * * * * * * * * * *                                ] ( 1)
// 2: [* * * * * * * *                 * * * * * * * *                ] ( 3)
// 3: [* * * * * * * *                                 * * * * * * * *] ( 2)
// 4: [* * * *         * * * *         * * * *         * * * *        ] ( 7)
// 5: [* * * *         * * * *                 * * * *         * * * *] ( 6)
// 6: [* * * *                 * * * * * * * *                 * * * *] ( 4)
// 7: [* * * *                 * * * *         * * * * * * * *        ] ( 5)
// 8: [* *     * *     * *     * *     * *     * *     * *     * *    ] (15)
// 9: [* *     * *     * *     * *         * *     * *     * *     * *] (14)
//10: [* *     * *         * *     * * * *     * *         * *     * *] (12)
//11: [* *     * *         * *     * *     * *     * * * *     * *    ] (13)
//12: [* *         * * * *         * * * *         * * * *         * *] ( 8)
//13: [* *         * * * *         * *     * * * *         * * * *    ] ( 9)
//14: [* *         * *     * * * *     * *         * *     * * * *    ] (11)
//15: [* *         * *     * * * *         * * * *     * *         * *] (10)
//16: [*   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *  ] (31)
//17: [*   *   *   *   *   *   *   *     *   *   *   *   *   *   *   *] (30)
//18: [*   *   *   *     *   *   *   * *   *   *   *     *   *   *   *] (28)
//19: [*   *   *   *     *   *   *   *   *   *   *   * *   *   *   *  ] (29)
//20: [*   *     *   * *   *     *   * *   *     *   * *   *     *   *] (24)
//21: [*   *     *   * *   *     *   *   *   * *   *     *   * *   *  ] (25)
//22: [*   *     *   *   *   * *   *   *   *     *   *   *   * *   *  ] (27)
//23: [*   *     *   *   *   * *   *     *   * *   *   *   *     *   *] (26)
//24: [*     * *     * *     * *     * *     * *     * *     * *     *] (16)
//25: [*     * *     * *     * *     *   * *     * *     * *     * *  ] (17)
//26: [*     * *     *   * *     * *   *     * *     *   * *     * *  ] (19)
//27: [*     * *     *   * *     * *     * *     * *   *     * *     *] (18)
//28: [*     *   * *   *     *   * *   *     *   * *   *     *   * *  ] (23)
//29: [*     *   * *   *     *   * *     * *   *     *   * *   *     *] (22)
//30: [*     *   * *     * *   *     * *     *   * *     * *   *     *] (20)
//31: [*     *   * *     * *   *     *   * *   *     * *     *   * *  ] (21)
// self-inverse

// ----- SRCFILE=walsh/walshdit2.cc: -----
void dit2_walsh_wak(double *f, ulong ldn);
// transform wrt. to walsh-kronecker basis (wak-functions)
// self-inverse
// same transform as dif2_walsh_wak()

void dit2_walsh_wal(double *f, ulong ldn);
// transform wrt. to walsh-kaczmarz basis (wal-functions)
// the wal functions are sequency- ordered
// self-inverse
// same transform as dif2_walsh_wal()

void dit2_walsh_pal(double *f, ulong ldn);
// transform wrt. to walsh-paley basis (pal-functions)
// self-inverse
// same transform as dif2_walsh_pal()

// ----- SRCFILE=walsh/walshseq.cc: -----
void walsh_seq(double *f, ulong ldn);
// walsh transform wrt. the basis (sequency at end of lines, '*':=1, ' ':=-1)
// 0: [* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] ( 0)
// 1: [* * * * * * * * * * * * * * * *                                ] ( 1)
// 2: [                * * * * * * * * * * * * * * * *                ] ( 2)
// 3: [* * * * * * * *                 * * * * * * * *                ] ( 3)
// 4: [        * * * * * * * *                 * * * * * * * *        ] ( 4)
// 5: [        * * * * * * * *         * * * *                 * * * *] ( 5)
// 6: [        * * * *         * * * * * * * *         * * * *        ] ( 6)
// 7: [* * * *         * * * *         * * * *         * * * *        ] ( 7)
// 8: [    * * * *         * * * *         * * * *         * * * *    ] ( 8)
// 9: [    * * * *         * * * *     * *         * * * *         * *] ( 9)
//10: [* *         * *     * * * *         * * * *     * *         * *] (10)
//11: [    * * * *     * *         * *     * * * *     * *         * *] (11)
//12: [    * *     * * * *     * *         * *     * * * *     * *    ] (12)
//13: [    * *     * * * *     * *     * *     * *         * *     * *] (13)
//14: [    * *     * *     * *     * * * *     * *     * *     * *    ] (14)
//15: [* *     * *     * *     * *     * *     * *     * *     * *    ] (15)
//16: [  * *     * *     * *     * *     * *     * *     * *     * *  ] (16)
//17: [  * *     * *     * *     * *   *     * *     * *     * *     *] (17)
//18: [*     * *     *   * *     * *     * *     * *   *     * *     *] (18)
//19: [  * *     * *   *     * *     *   * *     * *   *     * *     *] (19)
//20: [*     *   * *     * *   *     * *     *   * *     * *   *     *] (20)
//21: [*     *   * *     * *   *     *   * *   *     * *     *   * *  ] (21)
//22: [*     *   * *   *     *   * *     * *   *     *   * *   *     *] (22)
//23: [  * *   *     *   * *   *     *   * *   *     *   * *   *     *] (23)
//24: [  *   * *   *     *   * *   *     *   * *   *     *   * *   *  ] (24)
//25: [  *   * *   *     *   * *   *   *   *     *   * *   *     *   *] (25)
//26: [*   *     *   *   *   * *   *     *   * *   *   *   *     *   *] (26)
//27: [  *   * *   *   *   *     *   *   *   * *   *   *   *     *   *] (27)
//28: [  *   *   *   * *   *   *   *     *   *   *   * *   *   *   *  ] (28)
//29: [  *   *   *   * *   *   *   *   *   *   *   *     *   *   *   *] (29)
//30: [  *   *   *   *   *   *   *   * *   *   *   *   *   *   *   *  ] (30)
//31: [*   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *  ] (31)

void inverse_walsh_seq(double *f, ulong ldn);
// walsh transform wrt. the basis (sequency at end of lines, '*':=1, ' ':=-1)
// 0: [* *   *       *     *         *     *   * * *       *         *] (16)
// 1: [* *   *       *     *         * * *   *       * * *   * * * *  ] (15)
// 2: [* *   *       * * *   * * * *   * *   *       *     *         *] (16)
// 3: [* *   *       * * *   * * * *       *   * * *   * *   * * * *  ] (15)
// 4: [* *   * * * *   * *   *       *     *         * * *   *       *] (16)
// 5: [* *   * * * *   * *   *       * * *   * * * *       *   * * *  ] (15)
// 6: [* *   * * * *       *   * * *   * *   * * * *   * *   *       *] (16)
// 7: [* *   * * * *       *   * * *       *         *     *   * * *  ] (15)
// 8: [* * *   * *   *       * * *   *       *     *         * * *   *] (16)
// 9: [* * *   * *   *       * * *   * * * *   * *   * * * *       *  ] (15)
//10: [* * *   * *   * * * *       *   * * *   * *   *       * * *   *] (16)
//11: [* * *   * *   * * * *       *         *     *   * * *       *  ] (15)
//12: [* * *       *   * * *   * *   *       * * *   * * * *   * *   *] (16)
//13: [* * *       *   * * *   * *   * * * *       *         *     *  ] (15)
//14: [* * *       *         *     *   * * *       *   * * *   * *   *] (16)
//15: [* * *       *         *     *         * * *   *       *     *  ] (15)
//16: [*   * *   * * *   *       * * *   *     *         *       * * *] (16)
//17: [*   * *   * * *   *       * * * *   * *   * * * *   * * *      ] (15)
//18: [*   * *   * * * *   * * *       *   * *   * * *   *       * * *] (16)
//19: [*   * *   * * * *   * * *         *     *       *   * * *      ] (15)
//20: [*   * * *       *   * *   * * *   *       * * * *   * *   * * *] (16)
//21: [*   * * *       *   * *   * * * *   * * *         *     *      ] (15)
//22: [*   * * *         *     *       *   * * *       *   * *   * * *] (16)
//23: [*   * * *         *     *         *       * * *   *     *      ] (15)
//24: [*       *   * *   * * * *   * *   * * *   *       * * * *   * *] (16)
//25: [*       *   * *   * * * *   * * *       *   * * *         *    ] (15)
//26: [*       *   * * *         *     *       *   * *   * * * *   * *] (16)
//27: [*       *   * * *         *       * * *   *     *         *    ] (15)
//28: [*         *     *       *   * *   * * * *   * * *       *   * *] (16)
//29: [*         *     *       *   * * *         *       * * *   *    ] (15)
//30: [*         *       * * *   *     *         *     *       *   * *] (16)
//31: [*         *       * * *   *       * * * *   * *   * * *   *    ] (15)

// ----- SRCFILE=walsh/walshcirc.cc: -----
void walsh_circ(double *f, ulong ldn);
// transform wrt. the basis (sequency at end of lines), '*':=1, ' ':=-1:
// 0: [* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *] ( 0)
// 1: [* * * * * * * *                                 * * * * * * * *] ( 2)
// 2: [* * * *                 * * * * * * * *                 * * * *] ( 4)
// 3: [* * * *         * * * *                 * * * *         * * * *] ( 6)
// 4: [* *         * * * *         * * * *         * * * *         * *] ( 8)
// 5: [* *         * *     * * * *         * * * *     * *         * *] (10)
// 6: [* *     * *         * *     * * * *     * *         * *     * *] (12)
// 7: [* *     * *     * *     * *         * *     * *     * *     * *] (14)
// 8: [*     * *     * *     * *     * *     * *     * *     * *     *] (16)
// 9: [*     * *     *   * *     * *     * *     * *   *     * *     *] (18)
//10: [*     *   * *     * *   *     * *     *   * *     * *   *     *] (20)
//11: [*     *   * *   *     *   * *     * *   *     *   * *   *     *] (22)
//12: [*   *     *   * *   *     *   * *   *     *   * *   *     *   *] (24)
//13: [*   *     *   *   *   * *   *     *   * *   *   *   *     *   *] (26)
//14: [*   *   *   *     *   *   *   * *   *   *   *     *   *   *   *] (28)
//15: [*   *   *   *   *   *   *   *     *   *   *   *   *   *   *   *] (30)
//16: [*   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *  ] (31)
//17: [*   *   *   *     *   *   *   *   *   *   *   * *   *   *   *  ] (29)
//18: [*   *     *   *   *   * *   *   *   *     *   *   *   * *   *  ] (27)
//19: [*   *     *   * *   *     *   *   *   * *   *     *   * *   *  ] (25)
//20: [*     *   * *   *     *   * *   *     *   * *   *     *   * *  ] (23)
//21: [*     *   * *     * *   *     *   * *   *     * *     *   * *  ] (21)
//22: [*     * *     *   * *     * *   *     * *     *   * *     * *  ] (19)
//23: [*     * *     * *     * *     *   * *     * *     * *     * *  ] (17)
//24: [* *     * *     * *     * *     * *     * *     * *     * *    ] (15)
//25: [* *     * *         * *     * *     * *     * * * *     * *    ] (13)
//26: [* *         * *     * * * *     * *         * *     * * * *    ] (11)
//27: [* *         * * * *         * *     * * * *         * * * *    ] ( 9)
//28: [* * * *         * * * *         * * * *         * * * *        ] ( 7)
//29: [* * * *                 * * * *         * * * * * * * *        ] ( 5)
//30: [* * * * * * * *                 * * * * * * * *                ] ( 3)
//31: [* * * * * * * * * * * * * * * *                                ] ( 1)
// self-inverse

// ----- SRCFILE=walsh/walsh0.cc: -----
void walsh_wak0(double *f, ulong ldn);
// transform wrt. to walsh-kronecker basis (wak-functions)
// version for zero padded data

void walsh_wal0(double *f, ulong ldn);
// transform wrt. to walsh-kaczmarz basis (wal-functions)
// the wal functions are sequency- ordered

void walsh_pal0(double *f, ulong ldn);
// transform wrt. to walsh-paley basis (pal-functions)
// version for zero padded data


// ----- SRCFILE=slow/slowwalsh.cc: -----
void dit2_walsh_wak_slow(double *f, ulong ldn);
// transform wrt. to walsh-kronecker basis (wak-functions)
// same result as dit2_walsh_wak() but the loops
//  with loop variables j and r are swapped (as in ffts)
// ==> nonlocal ==> SLOW!

void dif2_walsh_wak_slow(double *f, ulong ldn);
// transform wrt. to walsh-kronecker basis (wak-functions)
// same result as dif2_walsh_wak() but the loops
//  with loop variables j and r are swapped (as in ffts)
// ==> nonlocal ==> SLOW!

inline void walsh_wal(double *f, ulong ldn);

inline void walsh_pal(double *f, ulong ldn);

inline void walsh_wak(double *f, ulong ldn);

