Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- /* Lazy impl of the extended Euclidean algorithm. */
- int invmod(int a, int n)
- {
- int t = 0, r = n, newt = 1, newr = a;
- while (newr != 0) {
- int tmp, q = (r / newr);
- tmp = newt; newt = t - q * newt; t = tmp;
- tmp = newr; newr = r - q * newr; r = tmp;
- }
- if (r > 1) t = 0; //printf("a is not invertible!\n");
- if (t < 0) t += n;
- return t;
- }
- /*
- * Can adapt this to m x n PFA splitting by replacing 15 with a strtoul on a second argument.
- * Note that m and n have to be coprime for this to work.
- */
- int main(int argc, char **argv)
- {
- int i, j, k = 0, Ntot, n = strtoul(argv[1], NULL, 10);
- int inv_1, inv_2;
- n = (1U << n);
- inv_1 = invmod(n, 15);
- inv_2 = invmod(15, n);
- Ntot = 15*n;
- printf("inv_1: %u\n", inv_2);
- printf("const uint16_t pfa15_fwd_reindex[%u] = {\n ", Ntot);
- for (i = 0; i < n; i++) {
- for (j = 0; j < 15; j++) {
- printf("%2u, ", (15*i + n*j)%Ntot);
- k++;
- }
- if (i+1 != n)
- printf("\n ");
- }
- printf("\n};\n\nconst uint16_t pfa15_inv_reindex[%u] = {\n ", Ntot);
- k = 0;
- for (j = 0; j < 15; j += 1) {
- for (i = 0; i < n; i++) {
- printf("%2u, ", (i*inv_2*15 + j*inv_1*n)%Ntot);
- k++;
- }
- if (j+1 != 15)
- printf("\n ");
- }
- printf("\n};\n\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement