<cffunction name="bitTable" output="true" returntype="query" description="Make a query/table of every possible binary combination of the given number of inputs">
<cffunction name="getImplicants" returntype="query" description="Given a set of function inputs and outputs, figure out which are the implicants (necessary)">
<!--- If we are just about to return the final result set to the original caller, eliminate all of the stuff we added, and return only the prime, do-care rows --->
<cffunction name="quine" output="true" returntype="any" description="Use the Quine-McCluskey algorithm to convert a set of function outputs into a minimum logic equation.">
<cfargument name="outputs" type="string">
<cfset var outString=reReplace(lCase(arguments.outputs),"[^01x]+","","ALL")>
<cfset var varCount=0>
<cfset var outArray=arrayNew(1)>
<cfset var i=0>
<cfset var bits="">
<cfset var implicants="">
<cfset var terms="">
<cfif len(outString) lte 0><cfthrow message="You must enter a list of outputs."></cfif>
<cfset varCount=log(len(outString)) / log(2)>
<cfif int(varCount) neq varCount><cfthrow message="The number of function outputs should be a power of 2. You entered #len(outString)# outputs."></cfif>