cp's OEIS Frontend

This is a front-end for the Online Encyclopedia of Integer Sequences, made by Christian Perfect. The idea is to provide OEIS entries in non-ancient HTML, and then to think about how they're presented visually. The source code is on GitHub.

A292060 Minimum number of points of the square lattice falling strictly inside an equilateral triangle of side n.

Original entry on oeis.org

0, 0, 0, 2, 4, 8, 12, 17, 23, 30, 37
Offset: 0

Views

Author

Andres Cicuttin, Sep 08 2017

Keywords

Comments

Due to the symmetry and periodicity of the square lattice it is sufficient to explore possible equilateral triangles with center belonging to the triangular region with vertices (0,0), (1/2, 0), and (1/2, 1/2), and for every center the orientations between 0 and 2*Pi/3 radians must be explored. A simple strategy to obtain this sequence is to explore many triangles with centers and orientations in the previously described regions and count the points falling strictly inside the triangles, then picking the minimum number obtained. In the given Mathematica program the explored triangles are generated by regularly moving its center with constant increment in both main orthogonal directions, and for every center different orientations are generated with constant angular step increment.
Is there any criterion to determine how small should be the pitch and the angular increment in order to catch an equilateral triangle with the smallest possible number of points for a given side length n?
The different regions for the centers producing constant minimum numbers of lattice points inside equilateral triangles of side length n seem to become very complex and irregular as n increases (see density plots in Links).

Crossrefs

Programs

  • Mathematica
    (* This gives a polar function of a "k" sides polygon with side length "sidelength" and vertical rightmost side  *)
    PolarPolygonSide[sidelength_, theta_, k_] := ((sidelength/2)/Tan[Pi/k])/Cos[Mod[theta - Pi/k , 2 Pi/k] - Pi/k];
    (* uncomment next to generate and plot different polygons *)
    (* Manipulate[PolarPlot[PolarPolygonSide[sidelength, theta + phase, sides], {theta, 0, 2 Pi}, PlotRange -> sidelength, GridLines -> {Range[-sidelength, sidelength] + di, Range[-sidelength, sidelength] + dj}], {sidelength, 1, 10, 1}, {sides, 3, 30, 1}, {phase, 0, 2 Pi/3, 2 Pi/300}, {dj, 0, 1/2, 0.01}, {di, 0, 1/2, 0.01}] *)
    (* This function gives 1 if the point of coordinates (x,y) is strictly inside a polygon given by PolarPolygonSide[sidelength, theta, sides] rotated by "phase", and 0 otherwise *)
    TruePointInsidePhase[x_, y_, sidelength_, phase_, sides_] :=
      Module[{theta},
       theta = ArcTan[x, y] + phase;
       If[x^2 + y^2 == 0, 1,
         If[x^2 + y^2 - (PolarPolygonSide[sidelength, theta, sides]^2) <
           0, 1, 0]] // Return];
    sides = 3; (* number of sides of the polygon *)
    (* The following step increments seem to be small enough for sidelengths up to 10 *)
    dstep = 0.01; (* scanning step on x and y *)
    phasestep = 2 Pi/3000; (* orientation angular increment step *)
    seq = {};
    Do[
    npoints = {}; k = 0;
    Do[Do[Do[
         Do[Do[
           k =
            k + TruePointInsidePhase[i + di, j + dj, sidelength, phase,
              sides]
           , {i, -sidelength - 1, sidelength + 1, 1}], {j, -sidelength -
            1, sidelength + 1, 1}];
         AppendTo[npoints, k];
         k = 0;
         , {dj, 0, 1/2, dstep}], {di, 0, 1/2, dstep}], {phase, 0, 2 Pi/3,
        phasestep}] // Quiet;
    temp = npoints // Min;
    AppendTo[seq, temp];
    , {sidelength, 0, 10, 1}]
    seq

Formula

a(n) ~ (1/4)*sqrt(3)*n^2.