Table of Contents
Fetching ...

Karatsuba Matrix Multiplication and its Efficient Custom Hardware Implementations

Trevor E. Pogue, Nicola Nicolici

TL;DR

This work extends the Karatsuba algorithm from scalar to matrix multiplication (KMM), preserving its multiplier-reducing advantages while mitigating the addition overhead that typically limits Karatsuba benefits for small bitwidths. It introduces a family of hardware architectures—baseline, fixed-precision, and precision-scalable—that map the KMM computation onto systolic arrays and MXUs suitable for GEMM in deep learning accelerators. Through a detailed complexity analysis and end-to-end evaluation on FPGA-based accelerators, the authors demonstrate improvements in throughput and area efficiency over conventional matrix multiplication and scalar Karatsuba implementations, including favorable performance-per-area in precision-scalable configurations and competitive results in fixed-precision designs. The results suggest that KMM and its hardware realizations can enhance integer-mominated DL workloads, including large GEMMs in CNNs and attention mechanisms, by delivering higher efficiency without sacrificing core architectural benefits like systolic locality and standard multiplier baselines.

Abstract

While the Karatsuba algorithm reduces the complexity of large integer multiplication, the extra additions required minimize its benefits for smaller integers of more commonly-used bitwidths. In this work, we propose the extension of the scalar Karatsuba multiplication algorithm to matrix multiplication, showing how this maintains the reduction in multiplication complexity of the original Karatsuba algorithm while reducing the complexity of the extra additions. Furthermore, we propose new matrix multiplication hardware architectures for efficiently exploiting this extension of the Karatsuba algorithm in custom hardware. We show that the proposed algorithm and hardware architectures can provide real area or execution time improvements for integer matrix multiplication compared to scalar Karatsuba or conventional matrix multiplication algorithms, while also supporting implementation through proven systolic array and conventional multiplier architectures at the core. We provide a complexity analysis of the algorithm and architectures and evaluate the proposed designs both in isolation and in an end-to-end deep learning accelerator system compared to baseline designs and prior state-of-the-art works implemented on the same type of compute platform, demonstrating their ability to increase the performance-per-area of matrix multiplication hardware.

Karatsuba Matrix Multiplication and its Efficient Custom Hardware Implementations

TL;DR

This work extends the Karatsuba algorithm from scalar to matrix multiplication (KMM), preserving its multiplier-reducing advantages while mitigating the addition overhead that typically limits Karatsuba benefits for small bitwidths. It introduces a family of hardware architectures—baseline, fixed-precision, and precision-scalable—that map the KMM computation onto systolic arrays and MXUs suitable for GEMM in deep learning accelerators. Through a detailed complexity analysis and end-to-end evaluation on FPGA-based accelerators, the authors demonstrate improvements in throughput and area efficiency over conventional matrix multiplication and scalar Karatsuba implementations, including favorable performance-per-area in precision-scalable configurations and competitive results in fixed-precision designs. The results suggest that KMM and its hardware realizations can enhance integer-mominated DL workloads, including large GEMMs in CNNs and attention mechanisms, by delivering higher efficiency without sacrificing core architectural benefits like systolic locality and standard multiplier baselines.

Abstract

While the Karatsuba algorithm reduces the complexity of large integer multiplication, the extra additions required minimize its benefits for smaller integers of more commonly-used bitwidths. In this work, we propose the extension of the scalar Karatsuba multiplication algorithm to matrix multiplication, showing how this maintains the reduction in multiplication complexity of the original Karatsuba algorithm while reducing the complexity of the extra additions. Furthermore, we propose new matrix multiplication hardware architectures for efficiently exploiting this extension of the Karatsuba algorithm in custom hardware. We show that the proposed algorithm and hardware architectures can provide real area or execution time improvements for integer matrix multiplication compared to scalar Karatsuba or conventional matrix multiplication algorithms, while also supporting implementation through proven systolic array and conventional multiplier architectures at the core. We provide a complexity analysis of the algorithm and architectures and evaluate the proposed designs both in isolation and in an end-to-end deep learning accelerator system compared to baseline designs and prior state-of-the-art works implemented on the same type of compute platform, demonstrating their ability to increase the performance-per-area of matrix multiplication hardware.
Paper Structure (32 sections, 23 equations, 12 figures, 3 tables, 5 algorithms)

This paper contains 32 sections, 23 equations, 12 figures, 3 tables, 5 algorithms.

Table of Contents

  1. Introduction
  2. Background and Related Work
  3. Notation
  4. Conventional n-Digit Scalar Multiplication ( FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'/FalseBooleanValue?<)
  5. Karatsuba Scalar Multiplication ( FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'/FalseBooleanValue?<)
  6. Conventional n-Digit Matrix Multiplication ( FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<)
  7. Precision-Scalable Architectures
  8. Karatsuba Matrix Multiplication ( FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<)
  9. FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<Definition
  10. FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<Complexity Analysis
  11. FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<Complexity
  12. FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'/FalseBooleanValue?<Complexity
  13. FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM*'/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM'/FalseBooleanValue?<Complexity
  14. FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<Complexity
  15. Arithmetic complexity
  16. ...and 17 more sections

Figures (12)

  • Figure 1: FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'/FalseBooleanValue?<?2 algorithm illustration.
  • Figure 2: FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'/FalseBooleanValue?<?2 algorithm illustration. Compared to FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'/FalseBooleanValue?<?2, FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'/FalseBooleanValue?<?2 requires only 3 single-digit multiplications, however, it requires 3 more additions, increasing the overall operation count.
  • Figure 3: FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<?2 algorithm illustration. The 4 single-digit matrix multiplications of complexity $\mathcal{O}( d^3)$ dominate the $\mathcal{O}( d^2)$ complexity of the matrix additions.
  • Figure 4: FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<?2 algorithm illustration. Compared to the scalar algorithms FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSM'/FalseBooleanValue?<?2 versus FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.SM'/FalseBooleanValue?<?2, the increase in number of additions with complexity $\mathcal{O}( d^2)$ in FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<?2 versus FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<?2 is now insignificant relative to the reduction of 3 instead of 4 single-digit matrix multiplications of complexity $\mathcal{O}( d^3)$, allowing the overall #operations in FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<?2 to be less than conventional FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<?2.
  • Figure 5: Plotting (\ref{['kmm:eq:mm-c']}) and (\ref{['kmm:eq:ksm-c']}) relative to (\ref{['kmm:eq:km-c']}) for different $n$ with $d = 64$. As can be seen, FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM*'/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM'/FalseBooleanValue?<?n requires over 75% more operations than FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<?n. Additionally, FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<?n and FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM*'/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM'/FalseBooleanValue?<?n require exponentially fewer operations than FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<?n with respect to $n$, however, FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KMM'/FalseBooleanValue?<?n requires fewer operations than FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<?n even starting at $n = 2$, while FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM*'/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.KSMM'/FalseBooleanValue?<?n does not fall below FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'*/FalseBooleanValue?< FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$ FalseBooleanValue_ FalseBooleanValue$_{}$ FalseBooleanValue_^[ ] FalseBooleanValue$_{}\IfNoValueTF{}{^{[ {} {} ]}}{}$.MM'/FalseBooleanValue?<?n until $n > 4$.
  • ...and 7 more figures