https://en.wikipedia.org/w/index.php?action=history&feed=atom&title=Certifying_algorithm Certifying algorithm - Revision history 2025-06-28T07:53:51Z Revision history for this page on the wiki MediaWiki 1.45.0-wmf.7 https://en.wikipedia.org/w/index.php?title=Certifying_algorithm&diff=1198007218&oldid=prev 78.22.198.37 at 18:55, 22 January 2024 2024-01-22T18:55:11Z <p></p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="en"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Previous revision</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 18:55, 22 January 2024</td> </tr><tr> <td colspan="2" class="diff-lineno">Line 20:</td> <td colspan="2" class="diff-lineno">Line 20:</td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | doi = 10.1007/s10817-013-9289-2</div></td> <td class="diff-marker"></td> <td style="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;"><div> | doi = 10.1007/s10817-013-9289-2</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | issue = 3</div></td> <td class="diff-marker"></td> <td style="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;"><div> | issue = 3</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="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;"><div> | journal = Journal of Automated Reasoning</div></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div> | journal = <ins style="font-weight: bold; text-decoration: none;">[[</ins>Journal of Automated Reasoning<ins style="font-weight: bold; text-decoration: none;">]]</ins></div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | pages = 241–273</div></td> <td class="diff-marker"></td> <td style="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;"><div> | pages = 241–273</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | title = A Framework for the Verification of Certifying Computations</div></td> <td class="diff-marker"></td> <td style="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;"><div> | title = A Framework for the Verification of Certifying Computations</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Line 29:</td> <td colspan="2" class="diff-lineno">Line 29:</td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div>==Examples==</div></td> <td class="diff-marker"></td> <td style="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;"><div>==Examples==</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div>Many examples of problems with checkable algorithms come from [[graph theory]].</div></td> <td class="diff-marker"></td> <td style="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;"><div>Many examples of problems with checkable algorithms come from [[graph theory]].</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="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;"><div>For instance, a classical algorithm for testing whether a graph is [[bipartite graph|bipartite]] would simply output a Boolean value: true if the graph is bipartite, false otherwise. In contrast, a certifying algorithm might output a 2-coloring of the graph in the case that it is bipartite, or a cycle of odd length if it is not. Any graph is bipartite if and only if it can be 2-colored, and non-bipartite if and only if it contains an odd cycle. Both checking whether a 2-coloring is valid and checking whether a given odd-length sequence of vertices is a cycle may be performed more simply than testing bipartiteness.&lt;ref name="mmns"/&gt;</div></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div>For instance, a classical algorithm for testing whether a graph is [[bipartite graph|bipartite]] would simply output a Boolean value: true if the graph is bipartite, false otherwise. In contrast, a certifying algorithm might output a <ins style="font-weight: bold; text-decoration: none;">[[graph coloring|</ins>2-coloring<ins style="font-weight: bold; text-decoration: none;">]]</ins> of the graph in the case that it is bipartite, or a <ins style="font-weight: bold; text-decoration: none;">[[cycle (graph theory)|</ins>cycle<ins style="font-weight: bold; text-decoration: none;">]]</ins> of odd length if it is not. Any graph is bipartite if and only if it can be 2-colored, and non-bipartite if and only if it contains an odd cycle. Both checking whether a 2-coloring is valid and checking whether a given odd-length sequence of vertices is a cycle may be performed more simply than testing bipartiteness.&lt;ref name="mmns"/&gt;</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><br /></td> <td class="diff-marker"></td> <td style="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;"><br /></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="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;"><div>Analogously, it is possible to test whether a given directed graph is [[directed acyclic graph|acyclic]] by a certifying algorithm that outputs either a [[topological sorting|topological order]] or a directed cycle. It is possible to test whether an undirected graph is a [[chordal graph]] by a certifying algorithm that outputs either an elimination ordering (an ordering of all vertices such that, for every vertex, the neighbors that are later in the ordering form a [[Clique (graph theory)|clique]]) or a chordless cycle. And it is possible to test whether a graph is [[planar graph|planar]] by a certifying algorithm that outputs either a planar embedding or a [[Kuratowski's theorem|Kuratowski subgraph]].&lt;ref name="mmns"/&gt;</div></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div>Analogously, it is possible to test whether a given <ins style="font-weight: bold; text-decoration: none;">[[</ins>directed graph<ins style="font-weight: bold; text-decoration: none;">]]</ins> is [[directed acyclic graph|acyclic]] by a certifying algorithm that outputs either a [[topological sorting|topological order]] or a directed cycle. It is possible to test whether an undirected graph is a [[chordal graph]] by a certifying algorithm that outputs either an elimination ordering (an ordering of all vertices such that, for every vertex, the neighbors that are later in the ordering form a [[Clique (graph theory)|clique]]) or a chordless cycle. And it is possible to test whether a graph is [[planar graph|planar]] by a certifying algorithm that outputs either a planar embedding or a [[Kuratowski's theorem|Kuratowski subgraph]].&lt;ref name="mmns"/&gt;</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><br /></td> <td class="diff-marker"></td> <td style="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;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div>The [[extended Euclidean algorithm]] for the [[greatest common divisor]] of two integers {{mvar|x}} and {{mvar|y}} is certifying: it outputs three integers {{mvar|g}} (the divisor), {{mvar|a}}, and {{mvar|b}}, such that {{math|''ax'' + ''by'' {{=}} ''g''}}. This equation can only be true of multiples of the greatest common divisor, so testing that {{mvar|g}} is the greatest common divisor may be performed by checking that {{mvar|g}} divides both {{mvar|x}} and {{mvar|y}} and that this equation is correct.&lt;ref name="mmns"/&gt;</div></td> <td class="diff-marker"></td> <td style="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;"><div>The [[extended Euclidean algorithm]] for the [[greatest common divisor]] of two integers {{mvar|x}} and {{mvar|y}} is certifying: it outputs three integers {{mvar|g}} (the divisor), {{mvar|a}}, and {{mvar|b}}, such that {{math|''ax'' + ''by'' {{=}} ''g''}}. This equation can only be true of multiples of the greatest common divisor, so testing that {{mvar|g}} is the greatest common divisor may be performed by checking that {{mvar|g}} divides both {{mvar|x}} and {{mvar|y}} and that this equation is correct.&lt;ref name="mmns"/&gt;</div></td> </tr> </table> 78.22.198.37 https://en.wikipedia.org/w/index.php?title=Certifying_algorithm&diff=916259824&oldid=prev Jarble: linking 2019-09-17T23:19:53Z <p>linking</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="en"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Previous revision</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 23:19, 17 September 2019</td> </tr><tr> <td colspan="2" class="diff-lineno">Line 1:</td> <td colspan="2" class="diff-lineno">Line 1:</td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="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;"><div>In [[theoretical computer science]], a '''certifying algorithm''' is an algorithm that outputs, together with a solution to the problem it solves, a proof that the solution is correct. A certifying algorithm is said to be ''efficient'' if the combined runtime of the algorithm and a proof checker is slower by at most a constant factor than the best known non-certifying algorithm for the same problem.&lt;ref name="mmns"&gt;{{citation</div></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div>In [[theoretical computer science]], a '''certifying algorithm''' is an algorithm that outputs, together with a solution to the problem it solves, a proof that the solution is correct. A certifying algorithm is said to be ''efficient'' if the combined runtime of the algorithm and a <ins style="font-weight: bold; text-decoration: none;">[[</ins>proof checker<ins style="font-weight: bold; text-decoration: none;">]]</ins> is slower by at most a constant factor than the best known non-certifying algorithm for the same problem.&lt;ref name="mmns"&gt;{{citation</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | last1 = McConnell | first1 = R.M.</div></td> <td class="diff-marker"></td> <td style="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;"><div> | last1 = McConnell | first1 = R.M.</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | last2 = Mehlhorn | first2 = K. | author2-link = Kurt Mehlhorn</div></td> <td class="diff-marker"></td> <td style="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;"><div> | last2 = Mehlhorn | first2 = K. | author2-link = Kurt Mehlhorn</div></td> </tr> </table> Jarble https://en.wikipedia.org/w/index.php?title=Certifying_algorithm&diff=841534240&oldid=prev OAbot: Open access bot: add arxiv identifier to citation with #oabot. 2018-05-16T12:31:17Z <p><a href="/wiki/Wikipedia:OABOT" class="mw-redirect" title="Wikipedia:OABOT">Open access bot</a>: add arxiv identifier to citation with #oabot.</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="en"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Previous revision</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 12:31, 16 May 2018</td> </tr><tr> <td colspan="2" class="diff-lineno">Line 23:</td> <td colspan="2" class="diff-lineno">Line 23:</td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | pages = 241–273</div></td> <td class="diff-marker"></td> <td style="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;"><div> | pages = 241–273</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div> | title = A Framework for the Verification of Certifying Computations</div></td> <td class="diff-marker"></td> <td style="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;"><div> | title = A Framework for the Verification of Certifying Computations</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td style="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;"><div> | volume = 52}}.&lt;/ref&gt;</div></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div> | volume = 52<ins style="font-weight: bold; text-decoration: none;">| arxiv = 1301.7462</ins>}}.&lt;/ref&gt;</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><br /></td> <td class="diff-marker"></td> <td style="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;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div>Implementations of certifying algorithms that also include a checker for the proof generated by the algorithm may be considered to be more reliable than non-certifying algorithms. For, whenever the algorithm is run, one of three things happens: it produces a correct output (the desired case), it detects a bug in the algorithm or its implication (undesired, but generally preferable to continuing without detecting the bug), or both the algorithm and the checker are faulty in a way that masks the bug and prevents it from being detected (undesired, but unlikely as it depends on the existence of two independent bugs).&lt;ref name="mmns"/&gt;</div></td> <td class="diff-marker"></td> <td style="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;"><div>Implementations of certifying algorithms that also include a checker for the proof generated by the algorithm may be considered to be more reliable than non-certifying algorithms. For, whenever the algorithm is run, one of three things happens: it produces a correct output (the desired case), it detects a bug in the algorithm or its implication (undesired, but generally preferable to continuing without detecting the bug), or both the algorithm and the checker are faulty in a way that masks the bug and prevents it from being detected (undesired, but unlikely as it depends on the existence of two independent bugs).&lt;ref name="mmns"/&gt;</div></td> </tr> </table> OAbot https://en.wikipedia.org/w/index.php?title=Certifying_algorithm&diff=735618549&oldid=prev David Eppstein: see also Sanity check; more cats 2016-08-22T00:04:01Z <p>see also <a href="/wiki/Sanity_check" title="Sanity check">Sanity check</a>; more cats</p> <table style="background-color: #fff; color: #202122;" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="en"> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Previous revision</td> <td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 00:04, 22 August 2016</td> </tr><tr> <td colspan="2" class="diff-lineno">Line 34:</td> <td colspan="2" class="diff-lineno">Line 34:</td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><br /></td> <td class="diff-marker"></td> <td style="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;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div>The [[extended Euclidean algorithm]] for the [[greatest common divisor]] of two integers {{mvar|x}} and {{mvar|y}} is certifying: it outputs three integers {{mvar|g}} (the divisor), {{mvar|a}}, and {{mvar|b}}, such that {{math|''ax'' + ''by'' {{=}} ''g''}}. This equation can only be true of multiples of the greatest common divisor, so testing that {{mvar|g}} is the greatest common divisor may be performed by checking that {{mvar|g}} divides both {{mvar|x}} and {{mvar|y}} and that this equation is correct.&lt;ref name="mmns"/&gt;</div></td> <td class="diff-marker"></td> <td style="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;"><div>The [[extended Euclidean algorithm]] for the [[greatest common divisor]] of two integers {{mvar|x}} and {{mvar|y}} is certifying: it outputs three integers {{mvar|g}} (the divisor), {{mvar|a}}, and {{mvar|b}}, such that {{math|''ax'' + ''by'' {{=}} ''g''}}. This equation can only be true of multiples of the greatest common divisor, so testing that {{mvar|g}} is the greatest common divisor may be performed by checking that {{mvar|g}} divides both {{mvar|x}} and {{mvar|y}} and that this equation is correct.&lt;ref name="mmns"/&gt;</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><br /></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div>==See also==</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div>*[[Sanity check]], a simple test of the correctness of an output or intermediate result that is not required to be a complete proof of correctness</div></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><br /></td> <td class="diff-marker"></td> <td style="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;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div>==References==</div></td> <td class="diff-marker"></td> <td style="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;"><div>==References==</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Line 39:</td> <td colspan="2" class="diff-lineno">Line 42:</td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><br /></td> <td class="diff-marker"></td> <td style="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;"><br /></td> </tr> <tr> <td class="diff-marker"></td> <td style="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;"><div>[[Category:Algorithms]]</div></td> <td class="diff-marker"></td> <td style="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;"><div>[[Category:Algorithms]]</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div>[[Category:Error detection and correction]]</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td style="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;"><div>[[Category:Software testing]]</div></td> </tr> </table> David Eppstein https://en.wikipedia.org/w/index.php?title=Certifying_algorithm&diff=735617732&oldid=prev David Eppstein: New article 2016-08-21T23:56:24Z <p>New article</p> <p><b>New page</b></p><div>In [[theoretical computer science]], a &#039;&#039;&#039;certifying algorithm&#039;&#039;&#039; is an algorithm that outputs, together with a solution to the problem it solves, a proof that the solution is correct. A certifying algorithm is said to be &#039;&#039;efficient&#039;&#039; if the combined runtime of the algorithm and a proof checker is slower by at most a constant factor than the best known non-certifying algorithm for the same problem.&lt;ref name=&quot;mmns&quot;&gt;{{citation<br /> | last1 = McConnell | first1 = R.M.<br /> | last2 = Mehlhorn | first2 = K. | author2-link = Kurt Mehlhorn<br /> | last3 = Näher | first3 = S.<br /> | last4 = Schweitzer | first4 = P.<br /> | date = May 2011<br /> | doi = 10.1016/j.cosrev.2010.09.009<br /> | issue = 2<br /> | journal = Computer Science Review<br /> | pages = 119–161<br /> | title = Certifying algorithms<br /> | volume = 5}}.&lt;/ref&gt;<br /> <br /> The proof produced by a certifying algorithm should be in some sense simpler than the algorithm itself, for otherwise any algorithm could be considered certifying (with its output verified by running the same algorithm again). Sometimes this is formalized by requiring that a verification of the proof take less time than the original algorithm, while for other problems (in particular those for which the solution can be found in [[linear time]]) simplicity of the output proof is considered in a less formal sense.&lt;ref name=&quot;mmns&quot;/&gt; For instance, the validity of the output proof may be more apparent to human users than the correctness of the algorithm, or a checker for the proof may be more amenable to [[formal verification]].&lt;ref name=&quot;mmns&quot;/&gt;&lt;ref&gt;{{citation<br /> | last1 = Alkassar | first1 = Eyad<br /> | last2 = Böhme | first2 = Sascha<br /> | last3 = Mehlhorn | first3 = Kurt | author3-link = Kurt Mehlhorn<br /> | last4 = Rizkallah | first4 = Christine<br /> | date = June 2013<br /> | doi = 10.1007/s10817-013-9289-2<br /> | issue = 3<br /> | journal = Journal of Automated Reasoning<br /> | pages = 241–273<br /> | title = A Framework for the Verification of Certifying Computations<br /> | volume = 52}}.&lt;/ref&gt;<br /> <br /> Implementations of certifying algorithms that also include a checker for the proof generated by the algorithm may be considered to be more reliable than non-certifying algorithms. For, whenever the algorithm is run, one of three things happens: it produces a correct output (the desired case), it detects a bug in the algorithm or its implication (undesired, but generally preferable to continuing without detecting the bug), or both the algorithm and the checker are faulty in a way that masks the bug and prevents it from being detected (undesired, but unlikely as it depends on the existence of two independent bugs).&lt;ref name=&quot;mmns&quot;/&gt;<br /> <br /> ==Examples==<br /> Many examples of problems with checkable algorithms come from [[graph theory]].<br /> For instance, a classical algorithm for testing whether a graph is [[bipartite graph|bipartite]] would simply output a Boolean value: true if the graph is bipartite, false otherwise. In contrast, a certifying algorithm might output a 2-coloring of the graph in the case that it is bipartite, or a cycle of odd length if it is not. Any graph is bipartite if and only if it can be 2-colored, and non-bipartite if and only if it contains an odd cycle. Both checking whether a 2-coloring is valid and checking whether a given odd-length sequence of vertices is a cycle may be performed more simply than testing bipartiteness.&lt;ref name=&quot;mmns&quot;/&gt;<br /> <br /> Analogously, it is possible to test whether a given directed graph is [[directed acyclic graph|acyclic]] by a certifying algorithm that outputs either a [[topological sorting|topological order]] or a directed cycle. It is possible to test whether an undirected graph is a [[chordal graph]] by a certifying algorithm that outputs either an elimination ordering (an ordering of all vertices such that, for every vertex, the neighbors that are later in the ordering form a [[Clique (graph theory)|clique]]) or a chordless cycle. And it is possible to test whether a graph is [[planar graph|planar]] by a certifying algorithm that outputs either a planar embedding or a [[Kuratowski&#039;s theorem|Kuratowski subgraph]].&lt;ref name=&quot;mmns&quot;/&gt;<br /> <br /> The [[extended Euclidean algorithm]] for the [[greatest common divisor]] of two integers {{mvar|x}} and {{mvar|y}} is certifying: it outputs three integers {{mvar|g}} (the divisor), {{mvar|a}}, and {{mvar|b}}, such that {{math|&#039;&#039;ax&#039;&#039; + &#039;&#039;by&#039;&#039; {{=}} &#039;&#039;g&#039;&#039;}}. This equation can only be true of multiples of the greatest common divisor, so testing that {{mvar|g}} is the greatest common divisor may be performed by checking that {{mvar|g}} divides both {{mvar|x}} and {{mvar|y}} and that this equation is correct.&lt;ref name=&quot;mmns&quot;/&gt;<br /> <br /> ==References==<br /> {{reflist}}<br /> <br /> [[Category:Algorithms]]</div> David Eppstein