fork download
  1. #include <stdio.h>
  2.  
  3. #define BIT 16
  4.  
  5. long I;
  6. long MODULO;
  7. long OMEGA;
  8.  
  9. unsigned long compToNum(short x, short y) {
  10. unsigned long n = (x + y * I + MODULO) % MODULO;
  11.  
  12. return n;
  13. }
  14.  
  15. short numToRe(unsigned long nRaw) {
  16. unsigned long n = nRaw % MODULO;
  17.  
  18. // if (n == OMEGA) {
  19. // return;
  20. // }
  21.  
  22. unsigned long geta = MODULO;
  23.  
  24. unsigned long nGeta = (n < OMEGA) ? (n + geta) : n;
  25.  
  26. short reRaw = (nGeta - 1) % I;
  27.  
  28. short re = (reRaw >= (I / 2)) ? (reRaw - I) : reRaw;
  29.  
  30. return re;
  31. }
  32.  
  33. short numToIm(unsigned long nRaw) {
  34. unsigned long n = nRaw % MODULO;
  35.  
  36. // if (n == OMEGA) {
  37. // return;
  38. // }
  39.  
  40. unsigned long geta = MODULO;
  41.  
  42. unsigned long nGeta = (n < OMEGA) ? (n + geta) : n;
  43.  
  44. short imRaw = ((nGeta - 1 + I / 2) >> BIT);
  45.  
  46. short im = imRaw - I;
  47.  
  48. return im;
  49. }
  50.  
  51. int main(void) {
  52. I = 1 << BIT;
  53. MODULO = I * I + 1;
  54. OMEGA = (1 << (BIT * 2 - 1)) - (1 << (BIT - 1));
  55.  
  56. unsigned long c1;
  57. unsigned long c2;
  58. unsigned long c;
  59.  
  60. short re1 = 3;
  61. short im1 = 3;
  62. short re2 = 0;
  63. short im2 = 5;
  64.  
  65. c1 = compToNum(re1, im1);
  66. c2 = compToNum(re2, im2);
  67. c = c1 * c2;
  68.  
  69. short re = numToRe(c);
  70. short im = numToIm(c);
  71.  
  72. printf("BIT: %d\n", BIT);
  73. printf("I: %ld\n", I);
  74. printf("MODULO: %ld\n", MODULO);
  75. printf("OMEGA: %ld\n", OMEGA);
  76. printf("c1: %ld: (%d, %d)\n", c1, numToRe(c1), numToIm(c1));
  77. printf("c2: %ld: (%d, %d)\n", c2, numToRe(c2), numToIm(c2));
  78. printf("c1 * c2: %ld: (%d, %d)", c, re, im);
  79.  
  80. return 0;
  81. }
  82.  
Success #stdin #stdout 0s 5284KB
stdin
Standard input is empty
stdout
BIT: 16
I: 65536
MODULO: 4294967297
OMEGA: 2147450880
c1: 196611: (3, 3)
c2: 327680: (0, 5)
c1 * c2: 64425492480: (-15, 15)