|
|
1.1 root 1: #include <stdio.h>
2: #include <string.h>
3:
4: char *xs();
5: unsigned long xsum();
6:
7:
8: char *
9: xs(key,body,n)
10: char *key, *body;
11: {
12: unsigned long t;
13: unsigned int x[2];
14: static char s[17];
15: char key2[8];
16: int i;
17:
18: strncpy(key2,key,8);
19: sprintf(s, "%d", n);
20: xinit();
21: xstring(s, strlen(s));
22: xstring("$$$",3);
23: xstring(key2,8);
24: xstring(body,n);
25: xstring("$$$",3);
26: xstring(body,n);
27: xstring(key2,8);
28: xstring("omega",5);
29:
30: t = xsum();
31: x[0] = t & 0xffff;
32: x[1] = (t>>16) & 0xffff;
33:
34: sprintf(s, "%4x%4x", x[0], x[1]);
35: xstring("digamma",7);
36: t = xsum();
37: x[0] ^= t & 0xffff;
38: x[1] ^= (t>>16) & 0xffff;
39: sprintf(s+8, "%4x%4x", x[0], x[1]);
40: for(i=0; i<16; i++) if(s[i]==' ') s[i] = '0';
41: return s;
42: }
43:
44: #define SRLEN 5
45:
46: static unsigned long sr[SRLEN], *sa, *sb;
47:
48: xinit()
49: {
50: int i;
51: for(i=0; i<SRLEN; i++) sr[i] = 0;
52: sa = &sr[0];
53: sb = &sr[1];
54: }
55:
56: unsigned long xsum() {
57: return *sa ^ *sb;
58: }
59:
60: xstring(s,n)
61: register char *s;
62: {
63: while(n-->0)
64: xcrank(*s++);
65: }
66:
67: unsigned long
68: phi(x)
69: register unsigned long x;
70: {
71: do {
72: x += 14921776 + x*(17761492 + x);
73: x ^= 0x5827066;
74: x += 0x2c357 + x*(10661688 ^ x);
75: x ^= x>>16;
76: } while((x&0x80000002) == 2);
77: return x;
78: }
79:
80: xcrank(x)
81: register x;
82: {
83: *sb++ += phi((x&0xff) + *sa++);
84: if(sa >= &sr[SRLEN]) sa = &sr[0];
85: if(sb >= &sr[SRLEN]) sb = &sr[0];
86: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.