在 C 中,为什么仅更改循环边界后结果就不同?

in C ,why result is different after only changing loop boundary?

我在验证有限域GF(13)中的点是否在椭圆曲线y^2 = x^3 + x + 1上时遇到了这个问题: 首先我设置循环边界为i<2,结果是正确的。

#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

您正在输入 undefined behavior。如果在循环内设置中断,您会注意到 k >= 13 超出了数组的范围。

您可以添加一些边界检查并考虑数组的大小。