home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume17 / hill / hill0.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-08  |  3.8 KB  |  212 lines

  1. ^X# include <stdio.h>
  2. ^X# include "table.i"
  3. ^X# ifdef DOS
  4. ^X# include <fcntl.h>
  5. ^X# include <io.h>
  6. ^X# endif
  7. ^X
  8. ^X# ifdef DOS
  9. ^X# define TTY "con"
  10. ^X# else
  11. ^X# define TTY "/dev/tty"
  12. ^X# endif
  13. ^X
  14. ^X# define Over(x) for (x = 0; x < order; x++)
  15. ^X# define Times(a,b) ((long)(a) * (long)(b) % 257)
  16. ^X
  17. ^Xint mode;
  18. ^X
  19. ^Xchar key[256];
  20. ^Xint matkey[16][16];
  21. ^Xint invec[16];
  22. ^Xint outvec[16];
  23. ^Xint order;
  24. ^X
  25. ^X
  26. ^Xsetup(argc, argv)
  27. ^Xint argc; char **argv;
  28. ^X    {
  29. ^X    FILE *tty;
  30. ^X
  31. ^X    if (strcmp(argv[1], "-e") == 0)
  32. ^X        mode = 'e';
  33. ^X    else if (strcmp(argv[1], "-d") == 0)
  34. ^X        mode = 'd';
  35. ^X    else {
  36. ^X        fprintf(stderr, "usage: hill -e [key]\n   or: hill -d [key]\n");
  37. ^X        exit(1);
  38. ^X        }
  39. ^X    if (argc > 2)
  40. ^X        strcpy(key, argv[2]);
  41. ^X    else {
  42. ^X        tty = fopen(TTY, "r+");
  43. ^X        setbuf(tty, NULL);
  44. ^X        fprintf(tty, "Key? ");
  45. ^X        fgets(key, sizeof(key), tty);
  46. ^X        key[strlen(key) - 1] = 0;
  47. ^X        fclose(tty);
  48. ^X        }
  49. ^X    }
  50. ^X
  51. ^Xmakemat()
  52. ^X    {
  53. ^X    int i, j, k;
  54. ^X    int n = 0;
  55. ^X    FILE *tty;
  56. ^X
  57. ^X    setorder();
  58. ^X    Over(i) Over(j)
  59. ^X        matkey[i][j] = key[n++];
  60. ^X    for (i = 0; i < strlen(key); i++)
  61. ^X        key[i] = 0;
  62. ^X    square();
  63. ^X    while ((k = invert()) != EOF)
  64. ^X        matkey[k][k] = (matkey[k][k] + 1) % 257;
  65. ^X    }
  66. ^X
  67. ^Xsetorder()
  68. ^X    {
  69. ^X    int n = strlen(key);
  70. ^X
  71. ^X    for (order = 0; order < 17; order++)
  72. ^X        if (order*order > n) break;
  73. ^X    order--;
  74. ^X    if (order < 3) {
  75. ^X        fprintf(stderr, "key size < 9\n");
  76. ^X        exit(1);
  77. ^X        }
  78. ^X    }
  79. ^X
  80. ^Xsquare()
  81. ^X    {
  82. ^X    int result[16][16];
  83. ^X    int i, j, k;
  84. ^X
  85. ^X    Over(i) Over(j)
  86. ^X        result[i][j] = 0;
  87. ^X    Over(i) Over(j) Over(k)
  88. ^X        result[i][j] += Times(matkey[i][k], matkey[k][j]);
  89. ^X    Over(i) Over(j)
  90. ^X        matkey[i][j] = result[i][j] % 257;
  91. ^X    }
  92. ^X
  93. ^Xint invert()
  94. ^X    {
  95. ^X    int matrix[16][16];
  96. ^X    int inverse[16][16];
  97. ^X    int i, j, k;
  98. ^X    int t;
  99. ^X    int pivot;
  100. ^X
  101. ^X    Over(i) Over(j) {
  102. ^X        matrix[i][j] = matkey[i][j];
  103. ^X        inverse[i][j] = 0;
  104. ^X        }
  105. ^X    Over(k)
  106. ^X        inverse[k][k] = 1;
  107. ^X
  108. ^X    Over(k) {
  109. ^X        if (matrix[k][k] == 0) {
  110. ^X            for (i = k + 1; i < order; i++)
  111. ^X                if (matrix[i][k]) {
  112. ^X                    Over(j) {
  113. ^X                        t = matrix[i][j];
  114. ^X                        matrix[i][j] = matrix[k][j];
  115. ^X                        matrix[k][j] = t;
  116. ^X                        t = inverse[i][j];
  117. ^X                        inverse[i][j] = inverse[k][j];
  118. ^X                        inverse[k][j] = t;
  119. ^X                        }
  120. ^X                    break;
  121. ^X                    }
  122. ^X            if (i == order) return(k);
  123. ^X            }
  124. ^X
  125. ^X        pivot = inverses[matrix[k][k]];
  126. ^X        Over(j) {
  127. ^X            matrix[k][j] = Times(matrix[k][j], pivot);
  128. ^X            inverse[k][j] = Times(inverse[k][j], pivot);
  129. ^X            }
  130. ^X        Over(i) if (i != k) {
  131. ^X            pivot = matrix[i][k];
  132. ^X            Over(j) {
  133. ^X                matrix[i][j] -= Times(pivot, matrix[k][j]);
  134. ^X                if (matrix[i][j] < 0) matrix[i][j] += 257;
  135. ^X                inverse[i][j] -= Times(pivot, inverse[k][j]);
  136. ^X                if (inverse[i][j] < 0) inverse[i][j] += 257;
  137. ^X                }
  138. ^X            }
  139. ^X        }
  140. ^X
  141. ^X    if (mode == 'd') Over(i) Over(j)
  142. ^X        matkey[i][j] = inverse[i][j];
  143. ^X    return(EOF);
  144. ^X    }
  145. ^X
  146. ^X
  147. ^Xint getvec()
  148. ^X    {
  149. ^X    int i;
  150. ^X    int padf = 0;
  151. ^X
  152. ^X    Over(i)
  153. ^X        if ((invec[i] = getchar()) == EOF) {
  154. ^X            if (i == 0) return(0);
  155. ^X            else if (padf) invec[i] = rand() % 257;
  156. ^X            else { invec[i] = 256; padf++; }
  157. ^X            }
  158. ^X        else if (invec[i] == 255 && mode == 'd')
  159. ^X            invec[i] += getchar();
  160. ^X    return(i);
  161. ^X    }
  162. ^X
  163. ^Xputvec()
  164. ^X    {
  165. ^X    int j;
  166. ^X
  167. ^X    Over(j)
  168. ^X        switch(outvec[j]) {
  169. ^X        case 256:
  170. ^X            if (mode == 'd') return;
  171. ^X            else putchar(255), putchar(1);
  172. ^X            break;
  173. ^X        case 255:
  174. ^X            putchar(255);
  175. ^X            if (mode == 'e') putchar(0);
  176. ^X            break;
  177. ^X        default:
  178. ^X            putchar(outvec[j]);
  179. ^X            }
  180. ^X    }
  181. ^X
  182. ^Xmatmul()
  183. ^X    {
  184. ^X    int i, j, k;
  185. ^X
  186. ^X    Over(i) {
  187. ^X        outvec[i] = 0;
  188. ^X        Over(j)
  189. ^X            outvec[i] += Times(invec[j], matkey[i][j]);
  190. ^X        outvec[i] %= 257;
  191. ^X        }
  192. ^X    }
  193. ^X
  194. ^Xmain(argc, argv)
  195. ^Xint argc; char **argv;
  196. ^X    {
  197. ^X    long tloc;
  198. ^X
  199. ^X# ifdef DOS
  200. ^X;setmode(fileno(stdin), O_BINARY);
  201. ^X    setmode(fileno(stdout), O_BINARY);
  202. ^X# endif
  203. ^X    time(&tloc);
  204. ^X    srand((int) tloc);
  205. ^X    setup(argc, argv);
  206. ^X    makemat();
  207. ^X    while(getvec()) {
  208. ^X;    matmul();
  209. ^X;    putvec();
  210. ^X;;}
  211. ^X    }
  212.