1<?php
2
3/**
4 * PHP Power of Two Modular Exponentiation Engine
5 *
6 * PHP version 5 and 7
7 *
8 * @category  Math
9 * @package   BigInteger
10 * @author    Jim Wigginton <terrafrost@php.net>
11 * @copyright 2017 Jim Wigginton
12 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
13 * @link      http://pear.php.net/package/Math_BigInteger
14 */
15
16namespace phpseclib3\Math\BigInteger\Engines\PHP\Reductions;
17
18use phpseclib3\Math\BigInteger\Engines\PHP\Base;
19
20/**
21 * PHP Power Of Two Modular Exponentiation Engine
22 *
23 * @package PHP
24 * @author  Jim Wigginton <terrafrost@php.net>
25 * @access  public
26 */
27abstract class PowerOfTwo extends Base
28{
29    /**
30     * Prepare a number for use in Montgomery Modular Reductions
31     *
32     * @param array $x
33     * @param array $n
34     * @param string $class
35     * @return array
36     */
37    protected static function prepareReduce(array $x, array $n, $class)
38    {
39        return self::reduce($x, $n, $class);
40    }
41
42    /**
43     * Power Of Two Reduction
44     *
45     * @param array $x
46     * @param array $n
47     * @param string $class
48     * @return array
49     */
50    protected static function reduce(array $x, array $n, $class)
51    {
52        $lhs = new $class();
53        $lhs->value = $x;
54        $rhs = new $class();
55        $rhs->value = $n;
56
57        $temp = new $class();
58        $temp->value = [1];
59
60        $result = $lhs->bitwise_and($rhs->subtract($temp));
61        return $result->value;
62    }
63}
64