neocnt

Number theory using FLINT
git clone git://www.tkruger.se/neocnt.git
Log | Files | Refs | README

hnpsolve.c (1727B)


      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 #include <flint.h>
      4 #include <fmpz_vec.h>
      5 #include <hnp.h>
      6 
      7 #define LINE_SIZE_MAX 4096
      8 
      9 static int read_next_fmpz(fmpz_t res)
     10 {
     11   char buffer[LINE_SIZE_MAX];
     12   size_t i;
     13 
     14   int next_char = getchar();
     15   while(next_char == '\n' || next_char == ' ')
     16     next_char = getchar();
     17 
     18   if(next_char == EOF)
     19     return -1;
     20 
     21   buffer[0] = next_char;
     22   i = 1;
     23   while(i < LINE_SIZE_MAX-1) {
     24     next_char = getchar();
     25     if(next_char == EOF || next_char == '\n' || next_char == ' ') 
     26       break;
     27 
     28     buffer[i] = (char) next_char;
     29 
     30     i++;
     31   }
     32   buffer[i] = '\0';
     33 
     34   return fmpz_set_str(res, buffer, 10);
     35 }
     36 
     37 static int read_stdin_instance(fmpz** a, fmpz** t, slong* m, fmpz_t* B, fmpz_t* n)
     38 {
     39   flint_scanf("%wd", m);
     40 
     41   if(read_next_fmpz(*B))
     42     return -1;
     43 
     44   if(read_next_fmpz(*n))
     45     return -1;
     46 
     47   *a = _fmpz_vec_init(*m);
     48   *t = _fmpz_vec_init(*m);
     49 
     50 
     51   slong i;
     52   int fail = 0;
     53   for(i = 0; i < *m; i++) {
     54     if(read_next_fmpz(&(*t)[i])) {
     55       fail = 1;
     56       break;
     57     }
     58 
     59     if(read_next_fmpz(&(*a)[i])) {
     60       fail = 1;
     61       break;
     62     }
     63   }
     64 
     65   if(fail) {
     66     _fmpz_vec_clear(*a, *m);
     67     _fmpz_vec_clear(*t, *m);
     68     return -1;
     69   }
     70 
     71   return 0;
     72 }
     73 
     74 int main(int argc, char* argv[])
     75 {
     76   slong m;
     77   fmpz* a;
     78   fmpz* t;
     79   fmpz_t B, n;
     80   fmpz_init(B);
     81   fmpz_init(n);
     82 
     83   if(read_stdin_instance(&a, &t, &m, &B, &n) != 0) {
     84     fprintf(stderr, "ERROR! Bad input format?\n");
     85     exit(1);
     86   }
     87 
     88   fmpz res[m+1];
     89   slong i;
     90   for(i = 0; i < m+1; i++) fmpz_init(&res[i]);
     91 
     92   int ret = hidden_number_problem(res, m+1, t, a, m, n, B);
     93   if(ret == 0) {
     94     for(i = 0; i < m; i++) {
     95       fmpz_print(&res[i]);
     96       printf(" ");
     97     }
     98     fmpz_print(&res[m]);
     99     printf("\n");
    100   }
    101 
    102   return 0;
    103 }