我们出题:求过给定五点的非退化二次曲线,自然要求点以及二次曲线的系数都尽量简单,为此可以利用MMA编程如下:
A = {{0}};
X = {{x1}, {x2}, {x3}};
l = 0;
r = 2; (*系数以及点的坐标范围*)
a = 0;
n = 0;
maxn = 500;
While[(a == 0 || l != 5 || Det[A] == 0) && n < maxn,
frlist = Table[RandomInteger[{-r, r}], {i, 6}];
A = {{frlist[[1]], frlist[[4]], frlist[[6]]},
{frlist[[4]], frlist[[2]], frlist[[5]]},
{frlist[[6]], frlist[[5]], frlist[[3]]}};
res = FindInstance[
Transpose[X].A.X == 0 &&
x1^2 + x2^2 + x3^2 != 0 && -r < x1 < r && -r < x2 < r && -r < x3 <
r && (x3 == 1 || x3 == 0), {x1, x2, x3}, Integers, 5];
l = Length[res];
If[l == 5,
a1 = X /. res[[1]] // Flatten;
a2 = X /. res[[2]] // Flatten;
a3 = X /. res[[3]] // Flatten;
a4 = X /. res[[4]] // Flatten;
a5 = X /. res[[5]] // Flatten;
a = Det[{a1, a2, a3}]
Det[{a1, a2, a4}] Det[{a1, a3, a4}] Det[{a2, a3, a4}]
Det[{a1, a2, a5}] Det[{a1, a3, a5}] Det[{a1, a4, a5}] Det[{a2, a3,
a5}] Det[{a2, a4, a5}] Det[{a3, a4, a5}]
; n++
];
]
A // MatrixForm
res
a
这段代码首先随机生成6个系数作为非退化二阶曲线的系数,然后检查他是否是非退化的;若是在其上找5个点,使得它们任何三点不共线。