2015-10-16 4 views
-1

Я столкнулся с этой проблемой при проверке того, находятся ли точки в конечном поле GF (13) на эллиптической кривой y^2 = x^3 + x + 1: Сначала я установил границу цикла как i < 2, результаты получились правильно.в C, почему результат отличается после изменения границы цикла?

#include <stdio.h> 
#include <math.h> 

void main() 
{ 
    int a[13], b[13]; 
    int j, i, m, k = 0; 
    for (i = 0; i < 2; i++) 
     for (j = 0; j < 13; j++) 
      if ((i * i * i + i + 1) % 13 == (j * j) % 13) { 
       a[k] = i; 
       b[k] = j; 
       k++; 
      } 
    printf ("\n There are %d points on the curve\nThe points are: ", k); 
    for (m = 0; m < k; m++) 
     printf ("\nx=%d,y=%d \n", a[m], b[m]); 
} 

В результате link 1

после того, как изменятся i<2 к i<13,

for(i=0;i<13;i++) 

первые 4 балла изменились: link 2

+1

Это делает именно то, что предполагается. Единственной проблемой выбора nit является 'main()' is type 'int' (например,' int main (void) '), а main возвращает значение,' return 0; 'по крайней мере. –

+0

@ DavidC.Rankin true с типом возвращаемого значения, но он имеет неявное возвращаемое значение '0', поскольку (я думаю) C99. – CoffeeandCode

+1

Согласовано, но в зависимости от компилятора вы получите предупреждение о невозможности предоставить возврат. И никто здесь не запускает код, который генерирует любые предупреждения ... ':)' –

ответ

2

Вы входите undefined behavior. Если вы установите разрыв внутри цикла, вы заметите, что k> = 13, который находится за пределами ваших массивов.

Вы можете добавить некоторые проверки границ и рассмотреть размер ваших массивов.