<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Further Steps Down The Wrong Path : Improving the Bit-Blasting of Multiplication</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Martin Brain</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>City, University of London</institution>
          ,
          <addr-line>Northampton Square, London, EC1V 0HB</addr-line>
          ,
          <country country="UK">United Kingdom</country>
        </aff>
      </contrib-group>
      <fpage>23</fpage>
      <lpage>31</lpage>
      <abstract>
        <p>“Bit-blasting” : reducing terms in the theory of bit-vectors to formulae in propositional logic, is a popular and efective technique. For logical operations, comparisons and even bit-vector addition, it produces circuits or CNF clauses that are linear in the size of the bit-vector formula and unit propagation gives efective bit-wise reasoning. However bit-blasting is highly limited when it comes to multiplication. The formulae produced are at least one order of magnitude larger than other terms and introduce significant dificulty into the SAT problem. Even basic awareness of modular ( 2) arithmetic and the vast body of arithmetic, algebraic and cryptographic theorems on it, make it clear that bit-blasting is the wrong path for handling multiplication. In this work-in-progress paper we sketch two further steps along this wrong path, compacting multiplication by constants and showing the existence of incremental encodings of multiplication. It is hoped that these will not only get us closer to “the best that can be achieved given the limitations” but also that they might eventually connect to less limited, algebraic techniques. No matter how far down the wrong road you've gone, turn back. - Turkish Proverb “Bit-blasting” is a technique for reducing first-order terms and predicates in the theory of bitvectors1 to propositional logic. Every bit in each bit-vector term is represented by a propositional literal and clauses are added that link them. Often additional proposition variables, so called intermediate variables, are used to control the size and complexity of the encoding. This reduction allows first-order (or “word-level”) equations to be solved using a SAT solver (or “bit-level” reasoning). Thus the immense (and on-going) improvements in SAT reasoning can be leveraged. Bit-blasting is often regarded as characteristic of SMT as a whole. Even though it is just one component in some modern solvers, and there are solvers such as COLIBRI [1] and iSAT3 [2, 3] that support the theory of bit-vectors without bit-blasting. It is easy to explain, easy to visualise and works very well2 It is not uncommon to find people who mistakenly believe that all of SMT is a variant on this technique.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>Section 2 discusses the current state-of-the-art and explains why multiplication (and other
“non-linear” operations) remain and likely will always be, cumbersome and dificult to handle
via bit-blasting. Having tried to convince the reader that this is the wrong path, Sections 3
and 4 outline our work-in-progress on improving the performance and reducing the overheads
of bit-blasting multiplication. No performance data is given as we only have prototype
implementations and a number of algorithmic questions remain open. There is also a question
over what would be appropriate benchmarks. Although it is easy to come up with synthetic
benchmarks (factoring, associativity, etc.) it is not clear how relevant they are. As there has
been a co-evolution of solvers and benchmarks, there is a shortage of graduated and calibrated
non-linear bit-vector problems.</p>
    </sec>
    <sec id="sec-2">
      <title>2. State-of-the-Art Bit-Blasting</title>
      <p>
        Bit-blasting implementations tend to convert each term or predicate independently3. For each
operator there is a small section of program which produces the bit-blasting. We will refer to the
program and the output interchangeably as their encoding or the circuit. Some implementations
produce CNF directly, but it is more common to produce a propositional circuit form. These
may be And-Inverter Graphs (AIG) or they may allow other logical gates, with XOR being
particularly useful. Bit-level constant propagation and rewriting is applied to this, either
onthe-fly or after the whole expression has been converted. If circuits are produced an encoding,
such as Plaisted-Greenbaum [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], is used to convert the intermediate form to propositional CNF4.
Finally this is passed to a SAT solver, normally a CDCL solver but there are some evidence that
other solver algorithms might be more efective [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        The encodings used for each operator can be evaluated in terms of a number of metrics. The
easiest but least predictive of performance is the size: either the number of clauses or the number
of intermediate variables produced. More useful in the small scale is whether the encoding is
propagation complete (with respect to unit propagation) [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ]. Given a partial assignment of the
input and output bits5, an encoding is propagation complete (with respect to unit propagation)
when if unit propagation will infer all of the bits that are logically entailed.
      </p>
      <p>
        Table 1 shows the current best known encodings for each of the bit-vector operators of length
. Operations that move and duplicate bits in a fixed pattern are efectively free because they
can be encoded by simply renaming propositional literals. Likewise negation can be encoded
by changing the polarity of the literals input. Operations that are ‘bit-parallel’ can be encoded
with a circuit for each bit. So bvand needs one AND gate (3 clauses) per bit and bvxor needs
one XOR gate (4 clauses) per bit. The non-standard bit-vector if-then-else (bvite) is bit-parallel
but shows an interesting efect. The smallest encoding is not propagation complete. This
happens with more complex operations, including multiplication. Smaller encodings do not
3Experience from [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] suggests that handling compound expressions would be an interesting source of
improvements.
      </p>
      <p>4Which, of course, is then pre-processed by the SAT solver. We will follow the conventions of the literature and
ignore this important step.</p>
      <p>5Whether assignments to intermediate variables are considered in propagation completeness is a subtle but
significant point that is often ignored in the literature.
Operators
concat, extract, repeat
rotate_left, rotate_right
zero_extend, sign_extend
bvnot
bvand, bvor, bvnand, bvnor
bvxor, bvxnor
bvite
bvcomp
bvult, bvule, bvugt, bvuge, bvslt,
bvsle, bvsgt, bvsge
bvneg
bvadd, bvsub
bvshl, bvlshr, bvashr
bvmul, bvudiv, bvurem, bvsdiv,
bvsmod</p>
      <p>CNF
0
0
0
0
3
4
4 / 6
4 + ( + 1)
6
7
14
( log())
(2)


( log())
(2)
✓
✓
×
×
necessarily propagate as well and encodings that propagate well are not necessarily small. Thus
it is important to be clear about which metrics we are aiming to improve.</p>
      <p>Most of the arithmetic operations make use of additional intermediate or auxiliary variables.
For example in comparisions it is useful to have ‘the previous  bits match’ propositions.
Likewise addition can be built from full-adders and intermediate ‘carry’ propositions.</p>
      <p>The first operations for which no propagation complete encodings are known are shifts. The
author believes that they can be created, but will likely increase the size of the encoding by a
constant factor. Note that shifts by a constant amount are a special case and are efectively zero
cost, like other static bit shufling.</p>
      <p>There are a very large number of possible encodings for multiplication. Without more useful
metrics and ways of comparing them (a work-in-progress) it is hard to explore this space in a
meaningful way. The most obvious (and popular) encoding is based on the shift-add algorithm:
bv multiplier_encoding(bv lhs, bv rhs) {
int n = lhs.length();
bv intermediate[n];
intermediate[0] = and(repeat(n,lhs[0]), rhs);
for (int i = 1; i &lt; n; ++i) {
intermediate[i] = add(intermediate[i-1],</p>
      <p>lshift(and(repeat(n,lhs[i]), rhs), i));
}</p>
      <p>return intermediate[n-1];
Here bv are data types that store a vector of propositional variables, one for each bit of the
bitvector. repeat, and, lshift and plus are functions that generate the appropriate encoding.</p>
      <p>The intermediate variables need *  propositional variables, plus * − 1 auxiliary variables
from the additions. There are  * 3 *  clauses from the and operations and ( − 1) * 14 * 
clauses from the additions. If  = 32 then this is 2, 016 variables and 16, 960 clauses. If  = 64
then this is 8, 128 variables and 68, 736 clauses for a single multiplier!</p>
      <p>
        Knuth [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] proposes use the use of Dadda multiplication reduction step so that it only uses
(2) full adders rather than ( log()). Bitwuzla [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] uses a Wallace tree reduction step for
this reason. In the author’s experience this does give a reduction in the number of clauses and
variables used but comes with a performance penalty.
      </p>
      <p>
        Limits of Multiplier Encodings How much could this be improved? A number of results
suggest that there are likely to be fundamental limits. Schönhage and Strassen [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] conjecture
that the lower complexity bound for multiplication of  bit numbers is  log(). As unit
propagation is worst-case linear in the size of the set of the clauses and is suficient to compute
multiplication if the input bits are fixed, it seems implausible that there is an encoding that has
less than ( log()) clauses and auxiliary variables. Recent work on  log() multipliers [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]
suggests that the coeficients involved will be undesirable for most bit-blasting applications.
      </p>
      <p>
        Reversing this argument, we can obtain a size bound on a propagation complete encoding of
multiplication. Given  =  *  with  and  prime, a propagation complete encoding could be
used to factor  in at most  calls to unit-propagation by incrementally calling unit-propagation
and then fixing bits of  if they are not set by the encoding. This would give a factoring algorithm
that would run in (2) steps where  is the size of the set of clauses. As the best known
algorithms for this task are pseudo-polynomial, the existence of polynomial-sized propagation
complete multipliers seems unlikely. Our experience in [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ] supports this conjecture as minimal
propagation complete encodings seem to show exponential growth in size.
      </p>
      <p>So, having shown that improved encodings for multiplication6 are likely to still be large and
will only propagate better when very large, we conclude that algebraic techniques (such as
incremental computation of Groebner bases) are much more likely to be efective and suggest
future researchers pursue those.</p>
      <p>In the rest of the paper we will ignore this advice.</p>
    </sec>
    <sec id="sec-3">
      <title>3. Multiplication by Constant</title>
      <p>For most bit-vector operators, constant propagation and some minor rewriting ((bvand a a)
→ a) during bit-blasting is enough produce optimised encodings when one operand is constant.
When using the shift-add multiplier above, normalising symmetry so that lhs is the constant
will reduce the number of additions to the number of 1s in lhs minus one. For program analysis
6In the naïve encoding, divide and remainder are both even more expensive. However rewriting them using the
defining identity / *  +  =  reduces them to basically multiplication (if you ignore divide by zero...).
(apart from cryptography) this is generally suficient as most constants are small. However for
lfoating-point multiplication by constant, we need to consider more varied bit-vector constants.</p>
      <p>Consider 127 * x. The shift-add multiplier with constant propagation would give:
127 * x = x«6 + x«5 + x«4 + x«3 + x«2 + x«1 + x
However 127 is a diference between powers of 2, so we can compute it as:</p>
      <p>127 * x = (128 - 1)*x = x«7 - x
So we have dropped from 6 additions down to just one. By treating contiguous sections of 1s in
this way we can reduce the number of additions to the number of parity changes in the number.
This is a significant saving in the average case but the worst-case, 01010101..., is still no
better than the shift-add approach above.</p>
      <p>This inspires our next trick; if the constant contains repeated patterns then we can use sharing
of expressions to reduce the number of additions. For example:</p>
      <p>0x5555 * x = (0x55«16 + 0x55) * x = (0x55 * x) « 16 + (0x55 * x).
Iterating this we can compute multiplication by 0x5555 using just 3 additions, rather than the
8 required previously. By combining these two techniques we can achieve an asymptotic (and
significant) improvement over the shift-add encoding.</p>
      <p>Unfortunately, it is not immediately obvious how to best combine these two; consider
0b10111011 * x. If we use shift-add multiplication with constant rewriting then this will
require 5 additions. Using subtraction of powers of two to create regions of 1s we can compute
it with 4 additions:
0b10111011 * x = x«7 + (0b111 * x)«3 + (0b11 *x)</p>
      <p>= x«7 + (x«3 - x)«3 + (x«2 - x)
However using the repeated pattern trick first requires just 3 additions, a 40% reduction from
our starting encoding:
0b10111011 * x = (0b1011 * x) « 4 + (0b1011 * x)</p>
      <p>0b1011 * x = x«3 + (x«2 - x)</p>
      <p>
        Before developing an algorithm, it is worth considering the context. It is relatively rare for
lfoating-point multiplications by constants to be encountered on their own. Weighted sums,
vector and matrix multiplication and evaluating neural networks will often multiply the same
number by several diferent constants. It is possible and desirable to share the same sub-terms
between multiplications by diferent constants. Unfortunately [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] suggests that this problem is
  -complete, bringing us full circle and needing a SAT solver to compute the best encoding
for a SAT solver!
      </p>
    </sec>
    <sec id="sec-4">
      <title>4. Multiplication Using Polynomial Interpolation</title>
      <p>A very common idiom in verification is “The full problem is very dificult or impossible, but how
much of it do we actually need to do?”. One way this is realised is via approximations. If the
full bit-blasting is large and adds complexity to the SAT solver, why not use an approximation
and refine as needed? Bryant et al. [ 14] proposes this idea but practical implementations run
into problems due to the lack of incremental encodings of multiplication. Using a variant of
the Toom-Cook multiplication algorithm [15, 16], with non-determinism rather than Gaussian
elimination, it is possilbe to create a series of encodings that over-approximate multiplication
and allow for incremental tightening of the approximation.</p>
      <p>Consider multiplying two 16-bit numbers7 c = a * b. We write each input as concatenations
of 4-bit components, a = a3:a2:a1:a0 and b = b3:b2:b1:b0. Rather than computing the
multiplication directly, let  and  be polynomials in  such that (16) = a and (16) = b:
() =
() =
a33 + a22 + a1 + a0
b33 + b22 + b1 + b0
we will refer to these as component polynomials. If we define  to be the product of the component
polynomials:
() = () * ()
=</p>
      <p>d66 + d55 + d44 + d33 + d22 + d1 + d0
then:</p>
      <p>a * b = (16) * (16) = (16) = c
By computing the coeficients of  we can evaluate the polynomial and obtain c:
c =</p>
      <p>d6«24 + d5«20 + d4«16 + d3«12 + d2«8 + d1«4 + d0
We could compute the coeficients of  directly but if we allow them to be non-deterministic, we
can constrain the value of  on any 7 points and by polynomial interpolation, the coeficients
will have the unique, correct value. Critically, we can add these 7 constraints incrementally
during the solving process, with each reducing the degree of over-approximation. By picking our
evaluation points to be small positive and negative powers of two, the size of the multiplications
we perform are greatly reduced:
(0) = (0) * (0)</p>
      <p>= a0 * b0
(1) = (1) * (1)
(− 1) = (− 1) * (− 1)</p>
      <p>= ((a2 + a0) + (a3 + a1)) * ((b2 + b0) + (b3 + b1))
7For simplicity of explanation we will omit the extensions and computation of necessary bit-widths. This turns
out to be a significantly more fiddly process than might be expected
=</p>
      <p>((a2 + a0) − (a3 + a1)) * ((b2 + b0) − (b3 + b1))
(2)
(− 2)
= (2) * (2)
=
((a2«2 + a0) + (a3«1 + a1)«1) *
((b2«2 + b0) + (b3«1 + b1)«1)
= (− 2) * (− 2)
=
((a2«2 + a0) − (a3«1 + a1)«1) *
((b2«2 + b0) − (b3«1 + b1)«1)
...</p>
      <p>This produces correct results but computing 7 (= 2 * (/) − 1) small
multiplications instead of one large multiplications is not necessarily a saving. Extensive experimentation
8 suggests that it is a net reduction in clauses and variables for 64-bit multipliers and the 24/48
and 53/106 bit multipliers needed for float32 and float64. But this is dependant on which
evaluation points are used, the number of components, etc.</p>
      <p>
        However, there remain a number of open questions about this approach:
• What is the best strategy for picking the component size? Longer components mean less
constraints but make the multiplications in them larger. Small components mean more
constraints and can reduce the size of the multiplication but evaluation at larger powers
of 2 will negate this. Optimising for cases where we can use existing small propagation
complete multipliers [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ] would seem promising.
• Is it possible to use the component polynomial of c? What is the relationship between
this order 7 polynomial and ?
• As presented we are computing a 2 bit output. For bit-vector multiplication we only
need the low  bits, for floating-point we need the high  + 1 bits. Is it possible to find
interpolation theorems specialised for these cases? Which evaluation points should be
used and in what order for these diferent use-cases?
• Applying this recursively at non-zero evaluation points may give a way to incrementally
expand the width of the multiplier, allowing this to be used for bit-blasting the theory of
integers.
      </p>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusion</title>
      <p>By blindly ignoring the right, algebraic path and continuing to try to step-wise improve the
bit-blasting of multiplication we have found ourselves with a number of algebraic questions
about the behaviour of polynomials over modulo 2 arithmetic. The author considers this an
entertainingly ironic place to finish a paper.</p>
      <p>8Many thanks to Kevin Stefanov for his work on these.</p>
    </sec>
    <sec id="sec-6">
      <title>Acknowledgments</title>
      <p>The author would like to thank Kevin Stefanov for his work on a prototype of the Toom-Cook
multiplier and Florian Schanda and the anonymous referees of SMT21 for their myriad of
suggestions.
[14] R. Bryant, D. Kroening, J. Ouaknine, S. Seshia, O. Strichman, B. Brady, Deciding Bit-Vector
Arithmetic with Abstraction, volume 4424 of Lecture Notes in Computer Science,
SpringerVerlag, Heidelberg, Germany, 2007, pp. 358–372. doi:10.1007/978-3-540-71209-1_
28.
[15] A. L. Toom, The Complexity of a Scheme of Functional Elements Realizing the
Multiplication of Integers, Soviet Mathematics - Doklady (1963) 714–716.
[16] S. A. Cook, On the Minimum Computation Time of Functions, Ph.D. thesis, Harvard
University, 1966.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>B.</given-names>
            <surname>Marre</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Blanc</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Mouy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Chihani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Vedrine</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bobot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>COLIBRI</given-names>
            ,
            <surname>SMT-COMP 2020 System Descriptions</surname>
          </string-name>
          (
          <year>2020</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>K.</given-names>
            <surname>Scheibler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Neubauer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mahdi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Fränzle</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Teige</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Bienmüller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Fehrer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Becker</surname>
          </string-name>
          ,
          <article-title>Accurate ICP-based Floating-point Reasoning</article-title>
          ,
          <source>in: Proceedings of the 16th Conference on Formal Methods in Computer-Aided Design, FMCAD '16</source>
          ,
          <string-name>
            <given-names>FMCAD</given-names>
            <surname>Inc</surname>
          </string-name>
          , Austin, TX,
          <year>2016</year>
          , pp.
          <fpage>177</fpage>
          -
          <lpage>184</lpage>
          . URL: http://dl.acm.org/citation.cfm?id=
          <volume>3077629</volume>
          .
          <fpage>3077660</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>F.</given-names>
            <surname>Neubauer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Scheibler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Becker</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mahdi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Fränzle</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Teige</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Bienmüller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Fehrer</surname>
          </string-name>
          ,
          <article-title>Accurate Dead Code Detection in Embedded C Code by Arithmetic Constraint Solving</article-title>
          , in: E. Ábrahám,
          <string-name>
            <given-names>J. H.</given-names>
            <surname>Davenport</surname>
          </string-name>
          , P. Fontaine (Eds.),
          <source>Proceedings of the 1st Workshop on Satisfiability Checking and Symbolic Computation</source>
          , volume
          <volume>1804</volume>
          <source>of CEUR</source>
          ,
          <year>2016</year>
          , pp.
          <fpage>32</fpage>
          -
          <lpage>38</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Schanda</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Sun</surname>
          </string-name>
          ,
          <article-title>Building Better Bit-Blasting for Floating-Point Problems</article-title>
          , in: T. s
          <string-name>
            <surname>Vojnar</surname>
          </string-name>
          , L. Zhang (Eds.),
          <article-title>Tools and Algorithms for the Construction and Analysis of Systems</article-title>
          , volume
          <volume>11427</volume>
          <source>of LNCS</source>
          , Heidelberg, Germany,
          <year>2019</year>
          , pp.
          <fpage>79</fpage>
          -
          <lpage>98</lpage>
          . doi:
          <volume>10</volume>
          .1007/ 978-3-
          <fpage>030</fpage>
          -17462-
          <issue>0</issue>
          _
          <fpage>5</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>D.</given-names>
            <surname>Plaisted</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Greenbaum</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A</given-names>
            <surname>Structure-Preserving Clause</surname>
          </string-name>
          Form Translation,
          <source>Journal of Symbolic Computation</source>
          <volume>2</volume>
          (
          <year>1986</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>V.</given-names>
            <surname>Liew</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Beame</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Devriendt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Elfers</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Nordström</surname>
          </string-name>
          ,
          <article-title>Verifying Properties of Bit-vector Multiplication Using Cutting Planes Reasoning</article-title>
          , in: Proceedings of FMCAD.,
          <year>2020</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Hadarean</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kroening</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Martins</surname>
          </string-name>
          ,
          <article-title>Automatic Generation of Propagation Complete SAT Encodings</article-title>
          , in: B.
          <string-name>
            <surname>Jobstmann</surname>
          </string-name>
          ,
          <string-name>
            <surname>M. K. R. Leino</surname>
            (Eds.), Verification,
            <given-names>Model</given-names>
          </string-name>
          <string-name>
            <surname>Checking</surname>
          </string-name>
          , and Abstract Interpretation, volume
          <volume>9583</volume>
          of Lecture Notes in Computer Science, SpringerVerlag, Heidelberg, Germany,
          <year>2016</year>
          , pp.
          <fpage>536</fpage>
          -
          <lpage>556</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>662</fpage>
          -49122-5_
          <fpage>26</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>M.</given-names>
            <surname>Brain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Hadarean</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kroening</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Martins</surname>
          </string-name>
          , Stronger, Better,
          <source>Faster: Optimally Propagating SAT Encodings</source>
          ,
          <year>2015</year>
          . Presentation only paper at SMT15.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>D. E.</given-names>
            <surname>Knuth</surname>
          </string-name>
          ,
          <source>The Art of Computer Programming</source>
          , Volume
          <volume>4</volume>
          ,
          <string-name>
            <surname>Fascicle</surname>
            <given-names>6</given-names>
          </string-name>
          : Satisfiability, 1st ed.,
          <string-name>
            <surname>Addison-Wesley Professional</surname>
          </string-name>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>A.</given-names>
            <surname>Niemetz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Preiner</surname>
          </string-name>
          , Bitwuzla at the SMT-COMP
          <year>2020</year>
          , CoRR abs/
          <year>2006</year>
          .01621 (
          <year>2020</year>
          ). URL: https://arxiv.org/abs/
          <year>2006</year>
          .01621. arXiv:
          <year>2006</year>
          .01621.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>A.</given-names>
            <surname>Schönhage</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Strassen</surname>
          </string-name>
          ,
          <source>Schnelle multiplikation großer zahlen, Computing</source>
          <volume>7</volume>
          (
          <year>1971</year>
          )
          <fpage>281</fpage>
          -
          <lpage>292</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>D.</given-names>
            <surname>Harvey</surname>
          </string-name>
          ,
          <string-name>
            <surname>J. van der Hoeven</surname>
          </string-name>
          , Integer Multiplication in Time ( log ),
          <source>Annals of Mathematics</source>
          <volume>193</volume>
          (
          <year>2021</year>
          )
          <fpage>563</fpage>
          -
          <lpage>617</lpage>
          . doi:
          <volume>10</volume>
          .4007/annals.
          <year>2021</year>
          .
          <volume>193</volume>
          .
          <issue>2</issue>
          .4.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Voronenko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Püschel</surname>
          </string-name>
          ,
          <article-title>Multiplierless multiple constant multiplication</article-title>
          ,
          <source>ACM Transactions on Algorithms</source>
          <volume>3</volume>
          (
          <year>2007</year>
          ).
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>