He visto mucha información útil aquí para dibujar curvas elípticas sobre los reales, pero tengo problemas para hacer lo mismo en un campo finito. Por ejemplo, digamos que intentamos dibujar los puntos en E: y^2 = x^3 + 1 con x,y en el campo de 17 elementos.
Probé algunas combinaciones de
\foreach \x in {1,...,16}
\foreach \y in {1,...,16}{
let \lhs = {int(mod(\y*\y, 17))}
let \rhs = {int(mod(\x*\x*\x + 1,17))}
\ifthenelse{\lhs = \rhs}{
\node[circle,draw] (\x \y) at (\x,\y) {\x};
}{}
}
pero nunca consigo que funcione... La imagen debería volverse similar a
Respuesta1
No puedes usarlo let
fuera de una ruta. Solo usa\pgfmathsetmacro\lhr{…}
(o en este caso \pgfmathtruncatemacro\lhr{…}
y descartar la int
función) o elevaluate
llavepara \foreach
.
Ajusté un poco el estilo del nodo y agregué los valores \x
y \y
como etiqueta para que puedas verificar los puntos evaluados.
Código
\documentclass[tikz]{standalone}
\usepackage{xifthen}
\begin{document}
\begin{tikzpicture}[every label/.append style={font=\small}]
\foreach[
evaluate={\rhs = int(mod(\x*\x*\x + 1, 17));}
] \x in {1,...,16}{
\foreach[
evaluate={\lhs = int(mod(\y*\y, 17));}
] \y in {1,...,16}{
\ifthenelse{\lhs = \rhs}{
\node[circle, red, fill, label={\x, \y}] at (\x,\y) {};
}{}
}
}
\end{tikzpicture}
\end{document}