Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. NativeCalculator.php

function NativeCalculator::doMul

Performs the multiplication of two non-signed large integers.

1 call to NativeCalculator::doMul()
NativeCalculator::mul in vendor/brick/math/src/Internal/Calculator/NativeCalculator.php
Multiplies two numbers.

File

vendor/brick/math/src/Internal/Calculator/NativeCalculator.php, line 401

Class

NativeCalculator
Calculator implementation using only native PHP code.

Namespace

Brick\Math\Internal\Calculator

Code

private function doMul(string $a, string $b) : string {
    $x = \strlen($a);
    $y = \strlen($b);
    $maxDigits = \intdiv($this->maxDigits, 2);
    $complement = 10 ** $maxDigits;
    $result = '0';
    for ($i = $x - $maxDigits;; $i -= $maxDigits) {
        $blockALength = $maxDigits;
        if ($i < 0) {
            $blockALength += $i;
            
            /** @psalm-suppress LoopInvalidation */
            $i = 0;
        }
        $blockA = (int) \substr($a, $i, $blockALength);
        $line = '';
        $carry = 0;
        for ($j = $y - $maxDigits;; $j -= $maxDigits) {
            $blockBLength = $maxDigits;
            if ($j < 0) {
                $blockBLength += $j;
                
                /** @psalm-suppress LoopInvalidation */
                $j = 0;
            }
            $blockB = (int) \substr($b, $j, $blockBLength);
            $mul = $blockA * $blockB + $carry;
            $value = $mul % $complement;
            $carry = ($mul - $value) / $complement;
            $value = (string) $value;
            $value = \str_pad($value, $maxDigits, '0', STR_PAD_LEFT);
            $line = $value . $line;
            if ($j === 0) {
                break;
            }
        }
        if ($carry !== 0) {
            $line = $carry . $line;
        }
        $line = \ltrim($line, '0');
        if ($line !== '') {
            $line .= \str_repeat('0', $x - $blockALength - $i);
            $result = $this->add($result, $line);
        }
        if ($i === 0) {
            break;
        }
    }
    return $result;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal