SHARE
TWEET

Untitled

a guest Aug 12th, 2017 46 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. typedef unsigned long long u64;
  5. typedef signed short s16;
  6.  
  7. const int N = 64;
  8.  
  9. u64 A[N*N];
  10.  
  11. u64 RndUniform() {
  12.     return (((u64)rand()) << 32ull) ^ rand();
  13. }
  14.  
  15. s16 RndNormal() {
  16.     u64 x = RndUniform(), y = 0;
  17.     y += x & 16383; x >>= 14;
  18.     y += x & 16383; x >>= 14;
  19.     y += x & 16383; x >>= 14;
  20.     y += x & 16383; x >>= 14;
  21.     return (x ^ y) - 32768;
  22. }
  23.  
  24. int main() {
  25.     srand(time(0) ^ rand());
  26.     for(int i=0;i<N*N;i++) A[i] = RndUniform();
  27.  
  28.     s16 p[N];
  29.     for(int i=0;i<N;i++) {
  30.         p[i] = RndNormal();
  31.     }
  32.     printf("p = [%d, %d, %d, ...] (%d bits)\n", p[0], p[1], p[2], 16*N);
  33.  
  34.     u64 k[N];
  35.     for(int i=0;i<N;i++) {
  36.         k[i] = RndNormal();
  37.         for(int j=0;j<N;j++) {
  38.             k[i] += A[j*N + i] * p[j];
  39.         }
  40.     }
  41.     printf("k = %016llX... (%d bits)\n", k[0], 64*N);
  42.  
  43.     u64 m[] = {2147483648, 2147483648, 2147483648, 2147483648};
  44.     u64 c[N*4];
  45.     for(int d=0;d<4;d++) {
  46.         u64 r[N];
  47.         for(int i=0;i<N;i++) {
  48.             r[i] = RndNormal();
  49.         }
  50.         for(int i=0;i<N;i++) {
  51.             c[i + N*d] = RndNormal();
  52.             for(int j=0;j<N;j++) {
  53.                 c[i + N*d] += A[i*N + j] * r[j];
  54.             }
  55.         }
  56.         for(int j=0;j<N;j++) {
  57.             m[d] -= k[j] * r[j];
  58.         }
  59.         m[d] >>= 32;
  60.     }
  61.     printf("G(r) = %016llX... (%d bits)\n", c[0], 64*N*4);
  62.     printf("FG(r)   = %08llX%08llX%08llX%08llX\n", m[0], m[1], m[2], m[3]);
  63.  
  64.     u64 v[] = {2147483648, 2147483648, 2147483648, 2147483648};
  65.     for(int d=0;d<4;d++) {
  66.         for(int j=0;j<N;j++) {
  67.             v[d] -= p[j] * c[j + N*d];
  68.         }
  69.         v[d] >>= 32;
  70.     }
  71.     printf("F(G(r)) = %08llX%08llX%08llX%08llX\n", v[0], v[1], v[2], v[3]);
  72. }
RAW Paste Data
Top