<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="language">
	<id>http://boolean.wiki.uib.no/index.php?action=history&amp;feed=atom&amp;title=Equivalence_Algorithms</id>
	<title>Equivalence Algorithms - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://boolean.wiki.uib.no/index.php?action=history&amp;feed=atom&amp;title=Equivalence_Algorithms"/>
	<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;action=history"/>
	<updated>2026-05-02T21:26:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=717&amp;oldid=prev</id>
		<title>Joakim: /* Linear Equivalence */</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=717&amp;oldid=prev"/>
		<updated>2024-11-23T00:48:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Linear Equivalence&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:48, 23 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l6&quot;&gt;Line 6:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 6:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Linear Equivalence =  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Linear Equivalence =  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Given two vectorial boolean functions &amp;lt;math&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;f &lt;/del&gt;&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;g &lt;/del&gt;&amp;lt;/math&amp;gt; we want to determine if there exist Linear permutations &amp;lt;math&amp;gt; A_1&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;A_2 &amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt; F = A_2 \circ G \circ A_1 &amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Given two vectorial boolean functions &amp;lt;math&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;F &lt;/ins&gt;&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;G &lt;/ins&gt;&amp;lt;/math&amp;gt; we want to determine if there exist Linear permutations &amp;lt;math&amp;gt; A_1&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;A_2 &amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt; F = A_2 \circ G \circ A_1 &amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==The to and from algorithm==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==The to and from algorithm==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=716&amp;oldid=prev</id>
		<title>Joakim at 00:47, 23 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=716&amp;oldid=prev"/>
		<updated>2024-11-23T00:47:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:47, 23 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l43&quot;&gt;Line 43:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 43:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We compose functions symbolically as &amp;lt;math&amp;gt;F \circ A_1 = \sum \alpha_u \cdot (M_u \circ A_1 )  &amp;lt;/math&amp;gt;. We have that &amp;lt;math&amp;gt;deg(F \circ A_1) \leq deg(F)  &amp;lt;/math&amp;gt;. We can also compose &amp;lt;math&amp;gt;A_2 \circ F &amp;lt;/math&amp;gt; where we replace &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; by &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;A : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; be an affine transformation with &amp;lt;math&amp;gt;A(x) = L(x) + a&amp;lt;/math&amp;gt;. The range of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; is an affine &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dimensional subspace so it&amp;#039;s orthogonal subspace is 1 dimensional, so spanned by a single vector &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;. We call &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; the half space mask (HSM), since it partitions the space into 2 halves. &amp;lt;math&amp;gt;h \cdot a &amp;lt;/math&amp;gt; is the half space free coefficient (HSC). Given an HSM and HSC &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; there is a canonical affine transformation &amp;lt;math&amp;gt;C_{|_{h,c}} : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We compose functions symbolically as &amp;lt;math&amp;gt;F \circ A_1 = \sum \alpha_u \cdot (M_u \circ A_1 )  &amp;lt;/math&amp;gt;. We have that &amp;lt;math&amp;gt;deg(F \circ A_1) \leq deg(F)  &amp;lt;/math&amp;gt;. We can also compose &amp;lt;math&amp;gt;A_2 \circ F &amp;lt;/math&amp;gt; where we replace &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; by &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;A : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; be an affine transformation with &amp;lt;math&amp;gt;A(x) = L(x) + a&amp;lt;/math&amp;gt;. The range of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; is an affine &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dimensional subspace so it&amp;#039;s orthogonal subspace is 1 dimensional, so spanned by a single vector &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;. We call &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; the half space mask (HSM), since it partitions the space into 2 halves. &amp;lt;math&amp;gt;h \cdot a &amp;lt;/math&amp;gt; is the half space free coefficient (HSC). Given an HSM and HSC &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; there is a canonical affine transformation &amp;lt;math&amp;gt;C_{|_{h,c}} : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We can now define the rank table of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with respect to some constant &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For any &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt; we calculate &amp;lt;math&amp;gt;u = SR((F \circ C_{|_{h,0}})_{\geq d} )&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v = SR((C_{|_{h,1}})_{\geq d}) &amp;lt;/math&amp;gt;. The rank table entry for &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; then becomes &amp;lt;math&amp;gt;(max(u,v),min(u,v))&amp;lt;/math&amp;gt;. For any specific tuple &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; the rank group is all &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; such that the rank table entry for &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt;. The rank histogram is a mapping for each &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; to the size of the rank group. One last thing we will need is the concept of the rank histogram with with respect to a given rank group. Fix an element &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt;. The rank histogram of &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; with respect to the rank group &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt;  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We can now define the rank table of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with respect to some constant &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For any &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt; we calculate &amp;lt;math&amp;gt;u = SR((F \circ C_{|_{h,0}})_{\geq d} )&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v = SR((C_{|_{h,1}})_{\geq d}) &amp;lt;/math&amp;gt;. The rank table entry for &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; then becomes &amp;lt;math&amp;gt;(max(u,v),min(u,v))&amp;lt;/math&amp;gt;. For any specific tuple &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; the rank group is all &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; such that the rank table entry for &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt;. The rank histogram is a mapping for each &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; to the size of the rank group. One last thing we will need is the concept of the rank histogram with with respect to a given rank group. Fix an element &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt;. The rank histogram of &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; with respect to the rank group &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;is defined the following way. Add &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; to all elements of the rank group &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; to get a set &amp;lt;math&amp;gt;U \subset F_2^n &amp;lt;/math&amp;gt;. For each element &amp;lt;math&amp;gt;h&amp;#039;&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; we look at the rank group containing &amp;lt;math&amp;gt;h&amp;#039;&amp;lt;/math&amp;gt;, let&amp;#039;s say it&amp;#039;s &amp;lt;math&amp;gt;(u&amp;#039;,v&amp;#039;)&amp;lt;/math&amp;gt;. The multi set containing the tuples &amp;lt;math&amp;gt;(u&amp;#039;,v&amp;#039;)&amp;lt;/math&amp;gt; for each element &amp;lt;math&amp;gt;h&amp;#039; \in U &amp;lt;/math&amp;gt; is the rank histogram of &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; with respect to &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt;. The rank group &amp;lt;math&amp;gt;(u,v) &amp;lt;/math&amp;gt; with respect to &amp;lt;math&amp;gt;(u&amp;#039;,v&amp;#039;)&amp;lt;/math&amp;gt; is the multiset rank histogram of each element &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; of the group &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; with respect to the group &amp;lt;math&amp;gt;(u&amp;#039;,v&amp;#039;)&amp;lt;/math&amp;gt;.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Algorithm===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Algorithm===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The main idea of the algorithm is that if &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent, then &amp;lt;math&amp;gt;SR(F_{\geq d}) = SR(G_{\geq d}) &amp;lt;/math&amp;gt;. If &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent with &amp;lt;math&amp;gt;F = A_2 \circ G \circ A_1 &amp;lt;/math&amp;gt; we are going to start by trying to reconstruct &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;. Do do this the idea is that for any element of the rank table of &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;G &amp;lt;/math&amp;gt;. So if we find a entry &amp;lt;math&amp;gt;(u,v) &amp;lt;/math&amp;gt; which contains only 1 element we know one point of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;. Now the rank groups can be large so only doing this may still result in a lot of guesses.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The main idea of the algorithm is that if &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent, then &amp;lt;math&amp;gt;SR(F_{\geq d}) = SR(G_{\geq d}) &amp;lt;/math&amp;gt;. If &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent with &amp;lt;math&amp;gt;F = A_2 \circ G \circ A_1 &amp;lt;/math&amp;gt; we are going to start by trying to reconstruct &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;. Do do this the idea is that for any element of the rank table of &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;G &amp;lt;/math&amp;gt;. So if we find a entry &amp;lt;math&amp;gt;(u,v) &amp;lt;/math&amp;gt; which contains only 1 element we know one point of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;. Now the rank groups can be large so only doing this may still result in a lot of guesses&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. For some group &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; we are going to pick another group &amp;lt;math&amp;gt;(u&amp;#039;,v&amp;#039;)&amp;lt;/math&amp;gt; and calculate the rank group of &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; with respect to &amp;lt;math&amp;gt;(u&amp;#039;,v&amp;#039;)&amp;lt;/math&amp;gt;. If this multiset contains an unique element, then the element &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; corresponding to this element must be matched to the corresponding element of &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (Due to the linearity of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;).  We can do this for any pair of groups, and if we find any element in the multiset of low cardinality we obtain a lot of information about possible matchings for &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;.  &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===Runtime===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The algorithm is estimated to be &amp;lt;math&amp;gt;O(n^32^n)&amp;lt;/math&amp;gt; for a random permutation. This is based to some assumption about the distribution of the rank tables of random functions&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=715&amp;oldid=prev</id>
		<title>Joakim at 23:54, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=715&amp;oldid=prev"/>
		<updated>2024-11-22T23:54:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:54, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l41&quot;&gt;Line 41:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 41:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The algorithm is based on using the rank table of a boolean functions, which we will now introduce. Given a boolean function &amp;lt;math&amp;gt;F: F_2^n \rightarrow F_2 &amp;lt;/math&amp;gt;. We are going to consider this object algebraically using the ANF (algebraic normal form). &amp;lt;math&amp;gt;F = \sum_{u \in F_2^n }\alpha_ux^u &amp;lt;/math&amp;gt;. We can look at &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as a vector spanned by all monomials &amp;lt;math&amp;gt;x^u = x_1^{u_1}...x_n^{u_n} &amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;F_{\geq d}&amp;lt;/math&amp;gt; be the polynomial containing all monomials of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with degree at least &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. Now given a vectorial boolean functions &amp;lt;math&amp;gt;F=(F_1,...,F_m)&amp;lt;/math&amp;gt; we define the symbolic rank of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as the rank of the vectors &amp;lt;math&amp;gt; \{F_i\}&amp;lt;/math&amp;gt; (where we view &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt; as a vector). Denote this as &amp;lt;math&amp;gt;SR(F)&amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The algorithm is based on using the rank table of a boolean functions, which we will now introduce. Given a boolean function &amp;lt;math&amp;gt;F: F_2^n \rightarrow F_2 &amp;lt;/math&amp;gt;. We are going to consider this object algebraically using the ANF (algebraic normal form). &amp;lt;math&amp;gt;F = \sum_{u \in F_2^n }\alpha_ux^u &amp;lt;/math&amp;gt;. We can look at &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as a vector spanned by all monomials &amp;lt;math&amp;gt;x^u = x_1^{u_1}...x_n^{u_n} &amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;F_{\geq d}&amp;lt;/math&amp;gt; be the polynomial containing all monomials of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with degree at least &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. Now given a vectorial boolean functions &amp;lt;math&amp;gt;F=(F_1,...,F_m)&amp;lt;/math&amp;gt; we define the symbolic rank of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as the rank of the vectors &amp;lt;math&amp;gt; \{F_i\}&amp;lt;/math&amp;gt; (where we view &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt; as a vector). Denote this as &amp;lt;math&amp;gt;SR(F)&amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We compose functions symbolically as &amp;lt;math&amp;gt;F \circ A_1 = \sum \alpha_u \cdot (M_u \circ A_1 )  &amp;lt;/math&amp;gt;. We have that &amp;lt;math&amp;gt;deg(F \circ A_1) \leq deg(F)  &amp;lt;/math&amp;gt;. We can also compose &amp;lt;math&amp;gt;A_2 \circ F &amp;lt;/math&amp;gt; where we replace &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; by &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;A : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; be an affine transformation with &amp;lt;math&amp;gt;A(x) = L(x) + a&amp;lt;/math&amp;gt;. The range of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; is an affine &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dimensional subspace so it&amp;#039;s orthogonal subspace is 1 dimensional, so spanned by a single vector &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;. We call &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; the half space mask (HSM), since it partitions the space into 2 halves. &amp;lt;math&amp;gt;h \cdot a &amp;lt;/math&amp;gt; is the half space free coefficient (HSC). Given an HSM and HSC &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; there is a canonical affine transformation &amp;lt;math&amp;gt;C_{|_{h,c}} : F_2{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We compose functions symbolically as &amp;lt;math&amp;gt;F \circ A_1 = \sum \alpha_u \cdot (M_u \circ A_1 )  &amp;lt;/math&amp;gt;. We have that &amp;lt;math&amp;gt;deg(F \circ A_1) \leq deg(F)  &amp;lt;/math&amp;gt;. We can also compose &amp;lt;math&amp;gt;A_2 \circ F &amp;lt;/math&amp;gt; where we replace &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; by &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;A : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; be an affine transformation with &amp;lt;math&amp;gt;A(x) = L(x) + a&amp;lt;/math&amp;gt;. The range of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; is an affine &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dimensional subspace so it&amp;#039;s orthogonal subspace is 1 dimensional, so spanned by a single vector &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;. We call &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; the half space mask (HSM), since it partitions the space into 2 halves. &amp;lt;math&amp;gt;h \cdot a &amp;lt;/math&amp;gt; is the half space free coefficient (HSC). Given an HSM and HSC &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; there is a canonical affine transformation &amp;lt;math&amp;gt;C_{|_{h,c}} : F_2&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;^&lt;/ins&gt;{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We can now define the rank table of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with respect to some constant &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For any &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt; we calculate &amp;lt;math&amp;gt;u = SR((F \circ C_{|_{h,0}})_{\geq d} )&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v = SR((C_{|_{h,1}})_{\geq d}) &amp;lt;/math&amp;gt;. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We can now define the rank table of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with respect to some constant &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For any &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt; we calculate &amp;lt;math&amp;gt;u = SR((F \circ C_{|_{h,0}})_{\geq d} )&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v = SR((C_{|_{h,1}})_{\geq d}) &amp;lt;/math&amp;gt;. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The rank table entry for &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; then becomes &amp;lt;math&amp;gt;(max(u,v),min(u,v))&amp;lt;/math&amp;gt;. For any specific tuple &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; the rank group is all &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; such that the rank table entry for &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; is &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt;. The rank histogram is a mapping for each &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; to the size of the rank group. One last thing we will need is the concept of the rank histogram with with respect to a given rank group. Fix an element &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt;. The rank histogram of &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; with respect to the rank group &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The main idea of the algorithm is that if &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent, then &amp;lt;math&amp;gt;SR(F_{\geq d}) = SR(G_{\geq d}) &amp;lt;/math&amp;gt;  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===Algorithm===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The main idea of the algorithm is that if &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent, then &amp;lt;math&amp;gt;SR(F_{\geq d}) = SR(G_{\geq d}) &amp;lt;/math&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. If &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent with &amp;lt;math&amp;gt;F = A_2 \circ G \circ A_1 &amp;lt;/math&amp;gt; we are going to start by trying to reconstruct &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;. Do do this the idea is that for any element of the rank table of &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; of &amp;lt;math&amp;gt;G &amp;lt;/math&amp;gt;. So if we find a entry &amp;lt;math&amp;gt;(u,v) &amp;lt;/math&amp;gt; which contains only 1 element we know one point of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt;. Now the rank groups can be large so only doing this may still result in a lot of guesses. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=714&amp;oldid=prev</id>
		<title>Joakim at 22:40, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=714&amp;oldid=prev"/>
		<updated>2024-11-22T22:40:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:40, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l41&quot;&gt;Line 41:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 41:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The algorithm is based on using the rank table of a boolean functions, which we will now introduce. Given a boolean function &amp;lt;math&amp;gt;F: F_2^n \rightarrow F_2 &amp;lt;/math&amp;gt;. We are going to consider this object algebraically using the ANF (algebraic normal form). &amp;lt;math&amp;gt;F = \sum_{u \in F_2^n }\alpha_ux^u &amp;lt;/math&amp;gt;. We can look at &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as a vector spanned by all monomials &amp;lt;math&amp;gt;x^u = x_1^{u_1}...x_n^{u_n} &amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;F_{\geq d}&amp;lt;/math&amp;gt; be the polynomial containing all monomials of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with degree at least &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. Now given a vectorial boolean functions &amp;lt;math&amp;gt;F=(F_1,...,F_m)&amp;lt;/math&amp;gt; we define the symbolic rank of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as the rank of the vectors &amp;lt;math&amp;gt; \{F_i\}&amp;lt;/math&amp;gt; (where we view &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt; as a vector). Denote this as &amp;lt;math&amp;gt;SR(F)&amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The algorithm is based on using the rank table of a boolean functions, which we will now introduce. Given a boolean function &amp;lt;math&amp;gt;F: F_2^n \rightarrow F_2 &amp;lt;/math&amp;gt;. We are going to consider this object algebraically using the ANF (algebraic normal form). &amp;lt;math&amp;gt;F = \sum_{u \in F_2^n }\alpha_ux^u &amp;lt;/math&amp;gt;. We can look at &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as a vector spanned by all monomials &amp;lt;math&amp;gt;x^u = x_1^{u_1}...x_n^{u_n} &amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;F_{\geq d}&amp;lt;/math&amp;gt; be the polynomial containing all monomials of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with degree at least &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. Now given a vectorial boolean functions &amp;lt;math&amp;gt;F=(F_1,...,F_m)&amp;lt;/math&amp;gt; we define the symbolic rank of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as the rank of the vectors &amp;lt;math&amp;gt; \{F_i\}&amp;lt;/math&amp;gt; (where we view &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt; as a vector). Denote this as &amp;lt;math&amp;gt;SR(F)&amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We compose functions symbolically as &amp;lt;math&amp;gt;F \circ A_1 = \sum \alpha_u \cdot (M_u \circ A_1 )  &amp;lt;/math&amp;gt;. We have that &amp;lt;math&amp;gt;deg(F \circ A_1) \leq deg(F)  &amp;lt;/math&amp;gt;. We can also compose &amp;lt;math&amp;gt;A_2 \circ F &amp;lt;/math&amp;gt; where we replace &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; by &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;A : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; be an affine transformation with &amp;lt;math&amp;gt;A(x) = L(x) + a&amp;lt;/math&amp;gt;. The range of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; is an affine &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dimensional subspace so it&amp;#039;s orthogonal subspace is 1 dimensional, so spanned by a single vector &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;. We call &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; the half space mask (HSM), since it partitions the space into 2 halves. &amp;lt;math&amp;gt;h \cdot a &amp;lt;/math&amp;gt; is the half space free coefficient (HSC). Given an HSM and HSC &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; there is a canonical affine transformation &amp;lt;math&amp;gt;C_{|_{h,c}} : F_2{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt;  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;We compose functions symbolically as &amp;lt;math&amp;gt;F \circ A_1 = \sum \alpha_u \cdot (M_u \circ A_1 )  &amp;lt;/math&amp;gt;. We have that &amp;lt;math&amp;gt;deg(F \circ A_1) \leq deg(F)  &amp;lt;/math&amp;gt;. We can also compose &amp;lt;math&amp;gt;A_2 \circ F &amp;lt;/math&amp;gt; where we replace &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; by &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;A : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; be an affine transformation with &amp;lt;math&amp;gt;A(x) = L(x) + a&amp;lt;/math&amp;gt;. The range of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; is an affine &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dimensional subspace so it&amp;#039;s orthogonal subspace is 1 dimensional, so spanned by a single vector &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;. We call &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; the half space mask (HSM), since it partitions the space into 2 halves. &amp;lt;math&amp;gt;h \cdot a &amp;lt;/math&amp;gt; is the half space free coefficient (HSC). Given an HSM and HSC &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; there is a canonical affine transformation &amp;lt;math&amp;gt;C_{|_{h,c}} : F_2{n-1} \rightarrow F_2^n &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/math&amp;gt;. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;We can now define the rank table of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with respect to some constant &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. For any &amp;lt;math&amp;gt;h \in F_2^n &amp;lt;/math&amp;gt; we calculate &amp;lt;math&amp;gt;u = SR((F \circ C_{|_{h,0}})_{\geq d} )&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;v = SR((C_{|_{h,1}})_{\geq d}) &amp;lt;/math&amp;gt;.  &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The main idea of the algorithm is that if &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; are affine equivalent, then &amp;lt;math&amp;gt;SR(F_{\geq d}) = SR(G_{\geq d}) &lt;/ins&gt;&amp;lt;/math&amp;gt;  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=713&amp;oldid=prev</id>
		<title>Joakim at 22:06, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=713&amp;oldid=prev"/>
		<updated>2024-11-22T22:06:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:06, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l39&quot;&gt;Line 39:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 39:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Rank table===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Rank table===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The algorithm is based on using the rank table of a boolean functions, which we will now introduce. Given a boolean function &amp;lt;math&amp;gt;F: F_2^n \rightarrow F_2 &amp;lt;/math&amp;gt;. We are going to consider this object algebraically using the ANF (algebraic normal form). &amp;lt;math&amp;gt;F = \sum_{u \in F_2^n }\alpha_ux^u &amp;lt;/math&amp;gt;. We can look at &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as a vector spanned by all monomials &amp;lt;math&amp;gt;x^u = x_1^{u_1}...x_n^{u_n} &amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;F_{\geq d}&amp;lt;/math&amp;gt; be the polynomial containing all monomials of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with degree at least &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. Now given a vectorial boolean functions &amp;lt;math&amp;gt;F=(F_1,...,F_m)&amp;lt;/math&amp;gt; we define the symbolic rank of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as the rank of the vectors &amp;lt;math&amp;gt; \{F_i\}&amp;lt;/math&amp;gt; (where we view &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt; as a vector). Denote this as &amp;lt;math&amp;gt;SR(F)&amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The algorithm is based on using the rank table of a boolean functions, which we will now introduce. Given a boolean function &amp;lt;math&amp;gt;F: F_2^n \rightarrow F_2 &amp;lt;/math&amp;gt;. We are going to consider this object algebraically using the ANF (algebraic normal form). &amp;lt;math&amp;gt;F = \sum_{u \in F_2^n }\alpha_ux^u &amp;lt;/math&amp;gt;. We can look at &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as a vector spanned by all monomials &amp;lt;math&amp;gt;x^u = x_1^{u_1}...x_n^{u_n} &amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;F_{\geq d}&amp;lt;/math&amp;gt; be the polynomial containing all monomials of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; with degree at least &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. Now given a vectorial boolean functions &amp;lt;math&amp;gt;F=(F_1,...,F_m)&amp;lt;/math&amp;gt; we define the symbolic rank of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; as the rank of the vectors &amp;lt;math&amp;gt; \{F_i\}&amp;lt;/math&amp;gt; (where we view &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt; as a vector). Denote this as &amp;lt;math&amp;gt;SR(F)&amp;lt;/math&amp;gt;.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;We compose functions symbolically as &amp;lt;math&amp;gt;F \circ A_1 = \sum \alpha_u \cdot (M_u \circ A_1 )  &amp;lt;/math&amp;gt;. We have that &amp;lt;math&amp;gt;deg(F \circ A_1) \leq deg(F)  &amp;lt;/math&amp;gt;. We can also compose &amp;lt;math&amp;gt;A_2 \circ F &amp;lt;/math&amp;gt; where we replace &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; by &amp;lt;math&amp;gt;F_i&amp;lt;/math&amp;gt;. Let &amp;lt;math&amp;gt;A : F_2^{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; be an affine transformation with &amp;lt;math&amp;gt;A(x) = L(x) + a&amp;lt;/math&amp;gt;. The range of &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; is an affine &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dimensional subspace so it&amp;#039;s orthogonal subspace is 1 dimensional, so spanned by a single vector &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;. We call &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; the half space mask (HSM), since it partitions the space into 2 halves. &amp;lt;math&amp;gt;h \cdot a &amp;lt;/math&amp;gt; is the half space free coefficient (HSC). Given an HSM and HSC &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; there is a canonical affine transformation &amp;lt;math&amp;gt;C_{|_{h,c}} : F_2{n-1} \rightarrow F_2^n &amp;lt;/math&amp;gt; &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=712&amp;oldid=prev</id>
		<title>Joakim at 21:22, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=712&amp;oldid=prev"/>
		<updated>2024-11-22T21:22:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:22, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l36&quot;&gt;Line 36:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 36:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Rank Algorithm==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Rank Algorithm==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This algorithm &amp;lt;ref name =&amp;quot;rank&amp;quot;&amp;gt;Dinur, Itai. &amp;quot;An improved affine equivalence algorithm for random permutations.&amp;quot; Annual International Conference on the Theory and Applications of Cryptographic Techniques. Cham: Springer International Publishing, 2018.&amp;lt;/ref&amp;gt; is efficient also for non-permutations but only functions of high algebraic degrees.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This algorithm &amp;lt;ref name =&amp;quot;rank&amp;quot;&amp;gt;Dinur, Itai. &amp;quot;An improved affine equivalence algorithm for random permutations.&amp;quot; Annual International Conference on the Theory and Applications of Cryptographic Techniques. Cham: Springer International Publishing, 2018.&amp;lt;/ref&amp;gt; is efficient also for non-permutations but only functions of high algebraic degrees.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===Rank table===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The algorithm is based on using the rank table of a boolean functions, which we will now introduce. Given a boolean function &amp;lt;math&gt;F: F_2^n \rightarrow F_2 &amp;lt;/math&gt;. We are going to consider this object algebraically using the ANF (algebraic normal form). &amp;lt;math&gt;F = \sum_{u \in F_2^n }\alpha_ux^u &amp;lt;/math&gt;. We can look at &amp;lt;math&gt;F&amp;lt;/math&gt; as a vector spanned by all monomials &amp;lt;math&gt;x^u = x_1^{u_1}...x_n^{u_n} &amp;lt;/math&gt;. Let &amp;lt;math&gt;F_{\geq d}&amp;lt;/math&gt; be the polynomial containing all monomials of &amp;lt;math&gt;F&amp;lt;/math&gt; with degree at least &amp;lt;math&gt;d&amp;lt;/math&gt;. Now given a vectorial boolean functions &amp;lt;math&gt;F=(F_1,...,F_m)&amp;lt;/math&gt; we define the symbolic rank of &amp;lt;math&gt;F&amp;lt;/math&gt; as the rank of the vectors &amp;lt;math&gt; \{F_i\}&amp;lt;/math&gt; (where we view &amp;lt;math&gt;F_i&amp;lt;/math&gt; as a vector). Denote this as &amp;lt;math&gt;SR(F)&amp;lt;/math&gt;.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Given two boolean functions &amp;lt;math&amp;gt;F,G : F_2^n \rightarrow F_2^m &amp;lt;/math&amp;gt; find two affine permutations &amp;lt;math&amp;gt;A_1,A_2&amp;lt;/math&amp;gt; and an affine transformation &amp;lt;math&amp;gt;A_3&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt;F = A_2 \circ G \circ A_1 + A_3 &amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Given two boolean functions &amp;lt;math&amp;gt;F,G : F_2^n \rightarrow F_2^m &amp;lt;/math&amp;gt; find two affine permutations &amp;lt;math&amp;gt;A_1,A_2&amp;lt;/math&amp;gt; and an affine transformation &amp;lt;math&amp;gt;A_3&amp;lt;/math&amp;gt; such that &amp;lt;math&amp;gt; F = A_2 \circ G \circ A_1 + A_3 &amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Jacobian algorithm==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Jacobian algorithm==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=711&amp;oldid=prev</id>
		<title>Joakim at 14:52, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=711&amp;oldid=prev"/>
		<updated>2024-11-22T14:52:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:52, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l34&quot;&gt;Line 34:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 34:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To actually compute the minimal representative of a function &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; we do the following. We want to construct &amp;lt;math&amp;gt;F&amp;#039;&amp;lt;/math&amp;gt;, the minimal permutation which is linear equivalent with &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. We start by guessing the value of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; at the smallest element of &amp;lt;math&amp;gt;F_2^n&amp;lt;/math&amp;gt;. Let say &amp;lt;math&amp;gt;A_1(x) = y&amp;lt;/math&amp;gt;. We now do the same as before with going back and forth between &amp;lt;math&amp;gt;A_1 &amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt;, the only difference we always pick the lowest possible value of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; to deduce a value of &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; and vise versa. Also whenever we need the value of a undefined point of &amp;lt;math&amp;gt;F&amp;#039;&amp;lt;/math&amp;gt;, we simply set to it to the lowest available.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To actually compute the minimal representative of a function &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; we do the following. We want to construct &amp;lt;math&amp;gt;F&amp;#039;&amp;lt;/math&amp;gt;, the minimal permutation which is linear equivalent with &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. We start by guessing the value of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; at the smallest element of &amp;lt;math&amp;gt;F_2^n&amp;lt;/math&amp;gt;. Let say &amp;lt;math&amp;gt;A_1(x) = y&amp;lt;/math&amp;gt;. We now do the same as before with going back and forth between &amp;lt;math&amp;gt;A_1 &amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt;, the only difference we always pick the lowest possible value of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; to deduce a value of &amp;lt;math&amp;gt;A_2&amp;lt;/math&amp;gt; and vise versa. Also whenever we need the value of a undefined point of &amp;lt;math&amp;gt;F&amp;#039;&amp;lt;/math&amp;gt;, we simply set to it to the lowest available.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==Rank Algorithm==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;This algorithm &amp;lt;ref name =&quot;rank&quot;&gt;Dinur, Itai. &quot;An improved affine equivalence algorithm for random permutations.&quot; Annual International Conference on the Theory and Applications of Cryptographic Techniques. Cham: Springer International Publishing, 2018.&amp;lt;/ref&gt; is efficient also for non-permutations but only functions of high algebraic degrees.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=EA equivalence=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=710&amp;oldid=prev</id>
		<title>Joakim at 14:36, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=710&amp;oldid=prev"/>
		<updated>2024-11-22T14:36:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:36, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l70&quot;&gt;Line 70:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 70:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Runtime===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Runtime===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The runtime of this algorithm is related to the rank table which is related to the differential uniformity of the function. Let &amp;lt;math&gt;R = \min R(F)[j] &amp;lt;/math&gt;. Then we will at worst have to make around &amp;lt;math&gt;R^s&amp;lt;/math&gt; guesses. For each such guess we will have to solve some linear equations which can be done in around &amp;lt;math&gt;(n^2+m^2)^w&amp;lt;/math&gt; where &amp;lt;math&gt;w&amp;lt;/math&gt; is a matrix multiplication constant. In total we get a time of &amp;lt;math&gt;O(max(n,m)^w2^n + R^s(m^2+n^2)^w)&amp;lt;/math&gt;, where the first part is for computing the rank table. Note that when &amp;lt;math&gt;F&amp;lt;/math&gt; is APN all the values have the same rank, so &amp;lt;math&gt;R = 2^n&amp;lt;/math&gt;. Which is the worst case for this algorithm.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=References=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=References=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=709&amp;oldid=prev</id>
		<title>Joakim at 14:20, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=709&amp;oldid=prev"/>
		<updated>2024-11-22T14:20:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:20, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l65&quot;&gt;Line 65:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 65:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;2. Let &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; be the number of guesses of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; we are going to make. Let &amp;lt;math&amp;gt;i = \min |R(F)[j]| &amp;lt;/math&amp;gt;. Pick &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; elements of &amp;lt;math&amp;gt;R(F)[i]&amp;lt;/math&amp;gt;. We are then gonna guess all possible values of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; on these points. But we only have to guess values inside &amp;lt;math&amp;gt;R[G][i]&amp;lt;/math&amp;gt;. Let&amp;#039;s say we made the guesses &amp;lt;math&amp;gt;A_1u_1 = w_1,...,A_1u_s = w_s&amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;2. Let &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; be the number of guesses of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; we are going to make. Let &amp;lt;math&amp;gt;i = \min |R(F)[j]| &amp;lt;/math&amp;gt;. Pick &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; elements of &amp;lt;math&amp;gt;R(F)[i]&amp;lt;/math&amp;gt;. We are then gonna guess all possible values of &amp;lt;math&amp;gt;A_1&amp;lt;/math&amp;gt; on these points. But we only have to guess values inside &amp;lt;math&amp;gt;R[G][i]&amp;lt;/math&amp;gt;. Let&amp;#039;s say we made the guesses &amp;lt;math&amp;gt;A_1u_1 = w_1,...,A_1u_s = w_s&amp;lt;/math&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;3. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Solve &lt;/del&gt;the &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; system of equations &amp;lt;math&amp;gt;X \cdot Jac_{lin}F(v_i) - Jac_{lin}F(w_i)\cdot Y, Y &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;c&lt;/del&gt;\&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dot &lt;/del&gt;v_i = 0 &amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;3. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Try to solve &lt;/ins&gt;the &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; system of equations &amp;lt;math&amp;gt;X \cdot Jac_{lin}F(v_i) - Jac_{lin}F(w_i)\cdot Y,&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;\: &lt;/ins&gt;Y \&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;cdot &lt;/ins&gt;v_i = 0 &amp;lt;/math&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. If this system has to many solutions make another guess (increase the value of &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; temporary).&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;4. When the system of equations does not have to many solutions find all solutions &amp;lt;math&amp;gt;(L_2,A_1)&amp;lt;/math&amp;gt;. Then deduce the rest of the values &amp;lt;math&amp;gt;A_3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_2&amp;lt;/math&amp;gt;. If this is possible we are done, otherwise go back to step 2 and make another guess.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;===Runtime===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=References=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=References=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
	<entry>
		<id>http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=708&amp;oldid=prev</id>
		<title>Joakim at 14:13, 22 November 2024</title>
		<link rel="alternate" type="text/html" href="http://boolean.wiki.uib.no/index.php?title=Equivalence_Algorithms&amp;diff=708&amp;oldid=prev"/>
		<updated>2024-11-22T14:13:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;language&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:13, 22 November 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l62&quot;&gt;Line 62:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 62:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;1. Compute the rank table of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;R(F)[j] = \{x \in F_2^n | rank(Jac_{lin}F(x)) = j \} &amp;lt;/math&amp;gt;. Do the same for &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;1. Compute the rank table of &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;R(F)[j] = \{x \in F_2^n | rank(Jac_{lin}F(x)) = j \} &amp;lt;/math&amp;gt;. Do the same for &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;2. Let &amp;lt;math&gt;s&amp;lt;/math&gt; be the number of guesses of &amp;lt;math&gt;A_1&amp;lt;/math&gt; we are going to make. Let &amp;lt;math&gt;i = \min |R(F)[j]| &amp;lt;/math&gt;. Pick &amp;lt;math&gt;s&amp;lt;/math&gt; elements of &amp;lt;math&gt;R(F)[i]&amp;lt;/math&gt;. We are then gonna guess all possible values of &amp;lt;math&gt;A_1&amp;lt;/math&gt; on these points. But we only have to guess values inside &amp;lt;math&gt;R[G][i]&amp;lt;/math&gt;. Let&#039;s say we made the guesses &amp;lt;math&gt;A_1u_1 = w_1,...,A_1u_s = w_s&amp;lt;/math&gt;.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;3. Solve the &amp;lt;math&gt;s&amp;lt;/math&gt; system of equations &amp;lt;math&gt;X \cdot Jac_{lin}F(v_i) - Jac_{lin}F(w_i)\cdot Y, Y c\dot v_i = 0 &amp;lt;/math&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=References=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=References=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joakim</name></author>
	</entry>
</feed>