Skip to content

Commit

Permalink
Direct search for diagonal cyclicity squares added
Browse files Browse the repository at this point in the history
The new version of latin.c file constructs squares both with horizontal/vertical and main-diagonal/antidiagonal cyclicity. The new datasets with all order-13 and order-17 squares added (the latter in the zip file).
  • Loading branch information
ipgmvq authored Apr 21, 2021
1 parent f8773e7 commit 90f05a1
Show file tree
Hide file tree
Showing 5 changed files with 19,163 additions and 36,850 deletions.
60 changes: 57 additions & 3 deletions latin.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#define ORDER_LIMIT 19
#define mod(x, p) (x < 0 ? x % p + p : x % p)


int order = 5;
int * vector;
FILE * output;
Expand Down Expand Up @@ -60,14 +61,27 @@ static void normalize(int position) {
static void hashSquareSraight(int _count) {
for (int row = 0; row < order; ++row)
for (int column = 0; column < order; ++column)
matrices[_count * matrix_size + row * order + column] = (char) mod(column - vector[row], order);
matrices[_count * matrix_size + row * order + column] = (char) mod((column - vector[row]), order);
}


static void hashSquareTranspose(int _count) {
for (int column = 0; column < order; ++column)
for (int row = 0; row < order; ++row)
matrices[_count * matrix_size + column * order + row] = (char) mod(column - vector[row], order);
matrices[_count * matrix_size + column * order + row] = (char) mod((column - vector[row]), order);
}

static void hashSquareMainDiagonal(int _count) {
for (int row = 0; row < order; ++row)
for (int column = 0; column < order; ++column)
matrices[_count * matrix_size + mod((column + row), order) * order + column] = (char) mod((column - vector[row]), order);
}


static void hashSquareAntiDiagonal(int _count) {
for (int column = 0; column < order; ++column)
for (int row = 0; row < order; ++row)
matrices[_count * matrix_size + mod((column + row), order) * order + order - 1 - column] = (char) mod((column - vector[row]), order);
}


Expand All @@ -76,7 +90,11 @@ static void step(int row) {
for (int column = 1; column < order; ++column) {
to_proceed = 1;
for (int row_history = 0; row_history < row; ++row_history)
if (column == vector[row_history] || mod(column - vector[row_history], order) == row - row_history || mod(vector[row_history] - column, order) == row - row_history)
if (
column == vector[row_history] ||
mod((column - vector[row_history]), order) == row - row_history ||
mod((vector[row_history] - column), order) == row - row_history
)
to_proceed = 0;
if (to_proceed) {
vector[row] = column;
Expand All @@ -93,6 +111,36 @@ static void step(int row) {
}



static void step_diagonal(int row) {
int to_proceed;
for (int column = 1; column < order; ++column) {
to_proceed = 1;
for (int row_history = 0; row_history < row; ++row_history)
if (
column == vector[row_history] ||
mod((row + column), order) == mod((row_history + vector[row_history]), order) ||
mod((mod((row + column), order) - mod((row_history + vector[row_history]), order)), order) == mod((column - vector[row_history]), order) ||
mod((- mod((row + column), order) + mod((row_history + vector[row_history]), order)), order) == mod((column - vector[row_history]), order) ||
mod((mod((row + column), order) - mod((row_history + vector[row_history]), order)), order) == mod((- column + vector[row_history]), order) ||
mod((- mod((row + column), order) + mod((row_history + vector[row_history]), order)), order) == mod((- column + vector[row_history]), order)
)
to_proceed = 0;
if (to_proceed) {
vector[row] = column;
if (row + 1 < order)
step_diagonal(row + 1);
else {
if (order <= ORDER_LIMIT) {
hashSquareMainDiagonal(count++);
hashSquareAntiDiagonal(count++);
} else count += 2;
}
}
}
}


int main(int argc, char * argv[]) {
time_t t0 = time(0);
char file_name[51] = "semi_cyclic_pandiagonal_latin_squares_order_5.txt";
Expand All @@ -118,6 +166,12 @@ int main(int argc, char * argv[]) {
vector[1] = i;
step(2);
}
for (int i = 1; i < order - 1; ++i) {
if (i != 6) {
vector[1] = i;
step_diagonal(2);
}
}
int countNonEqual = 0;
if (order <= ORDER_LIMIT) {
for (int i = 0; i < count; ++i) normalize(i);
Expand Down
30 changes: 16 additions & 14 deletions latin_square_cyclicity_check.html
Original file line number Diff line number Diff line change
Expand Up @@ -14279,7 +14279,7 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
<div class="jp-Cell-inputWrapper">
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In&nbsp;[1]:</div>
<div class="jp-InputPrompt jp-InputArea-prompt">In&nbsp;[6]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
Expand All @@ -14294,7 +14294,7 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs ">
<div class="jp-Cell-inputWrapper">
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In&nbsp;[2]:</div>
<div class="jp-InputPrompt jp-InputArea-prompt">In&nbsp;[19]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">pandiagonal</span><span class="p">(</span><span class="n">matrix</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">order</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
Expand All @@ -14303,14 +14303,14 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an
<span class="n">matrix_</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">matrix_</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">np</span><span class="o">.</span><span class="n">mod</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">order</span><span class="p">)</span> <span class="o">+</span> <span class="n">i</span><span class="p">,</span> <span class="n">order</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">order</span><span class="p">):</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">(</span><span class="n">matrix_</span><span class="p">[:,</span><span class="n">i</span><span class="p">])</span><span class="o">.</span><span class="n">size</span> <span class="o">&lt;</span> <span class="n">order</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">(</span><span class="n">matrix_</span><span class="p">[:,</span><span class="n">i</span><span class="p">])</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
<span class="c1">#print(np.unique(matrix_[:,i]).size)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="n">matrix_</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">order</span><span class="p">):</span>
<span class="n">matrix_</span><span class="p">[</span><span class="n">i</span><span class="p">,:]</span> <span class="o">=</span> <span class="n">matrix_</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">np</span><span class="o">.</span><span class="n">mod</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">order</span><span class="p">)</span> <span class="o">-</span> <span class="n">i</span><span class="p">,</span> <span class="n">order</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">order</span><span class="p">):</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">(</span><span class="n">matrix_</span><span class="p">[:,</span><span class="n">i</span><span class="p">])</span><span class="o">.</span><span class="n">size</span> <span class="o">&lt;</span> <span class="n">order</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">(</span><span class="n">matrix_</span><span class="p">[:,</span><span class="n">i</span><span class="p">])</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
<span class="c1">#print(np.unique(matrix_[:,i]).size)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="kc">True</span>

Expand Down Expand Up @@ -14350,7 +14350,7 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an
<span class="k">break</span>


<span class="n">not_antidiagonal</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">not_main_diagonal</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">main_diag</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">order</span><span class="p">):</span>
<span class="n">main_diag</span><span class="p">[:,</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">main_diag</span><span class="p">[:,</span><span class="n">column</span><span class="p">],</span> <span class="n">column</span><span class="p">)</span>
Expand All @@ -14360,10 +14360,10 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an
<span class="k">if</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">main_diag</span><span class="p">[</span><span class="n">row</span><span class="p">],</span> <span class="n">shift</span><span class="p">)</span> <span class="o">==</span> <span class="n">main_diag</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">shift_answer</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">shift_answer</span><span class="p">:</span>
<span class="n">not_antidiagonal</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">not_main_diagonal</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">break</span>

<span class="n">not_main_diagonal</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">not_antidiagonal</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">anti_diag</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">order</span><span class="p">):</span>
<span class="n">anti_diag</span><span class="p">[:,</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">anti_diag</span><span class="p">[:,</span><span class="n">column</span><span class="p">],</span> <span class="o">-</span><span class="n">column</span><span class="p">)</span>
Expand All @@ -14373,7 +14373,7 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an
<span class="k">if</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">roll</span><span class="p">(</span><span class="n">anti_diag</span><span class="p">[</span><span class="n">row</span><span class="p">],</span> <span class="n">shift</span><span class="p">)</span> <span class="o">==</span> <span class="n">anti_diag</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="n">shift_answer</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">shift_answer</span><span class="p">:</span>
<span class="n">not_main_diagonal</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">not_antidiagonal</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">break</span>

<span class="k">return</span> <span class="p">(</span><span class="n">not_horizontal</span><span class="p">,</span> <span class="n">not_vertical</span><span class="p">,</span> <span class="n">not_main_diagonal</span><span class="p">,</span> <span class="n">not_antidiagonal</span><span class="p">)</span>
Expand All @@ -14389,7 +14389,7 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell ">
<div class="jp-Cell-inputWrapper">
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In&nbsp;[3]:</div>
<div class="jp-InputPrompt jp-InputArea-prompt">In&nbsp;[25]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">squares</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
Expand All @@ -14398,7 +14398,7 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an

<span class="n">order</span> <span class="o">=</span> <span class="kc">None</span>

<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;semi_cyclic_pandiagonal_latin_squares_order_17.txt&#39;</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;semi_cyclic_pandiagonal_latin_squares_order_13.txt&#39;</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">():</span>
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
<span class="k">if</span> <span class="n">order</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
Expand Down Expand Up @@ -14459,10 +14459,12 @@ <h3 id="Please-be-warned-that-the-script-is-sensitive-to-the-newline-symbols-(an

<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>There are 0 non-pandiagonal squares in the dataset
16538 sqaures were read
8262 squares are cyclic in a horizontal direction
8262 squares are cyclic in a vertical direction
14 squares are cyclic in all four directions
1362 sqaures were read
338 squares are cyclic in a horizontal direction
338 squares are cyclic in a main-diagonal direction
338 squares are cyclic in a vertical direction
338 squares are cyclic in a antidiagonal direction
10 squares are cyclic in all four directions
</pre>
</div>
</div>
Expand Down
Loading

0 comments on commit 90f05a1

Please sign in to comment.