|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Zxing\Common\Reedsolomon; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final class GenericGF |
|
|
{ |
|
|
|
|
|
public static $AZTEC_DATA_12; |
|
|
public static $AZTEC_DATA_10; |
|
|
public static $AZTEC_DATA_6; |
|
|
public static $AZTEC_PARAM; |
|
|
public static $QR_CODE_FIELD_256; |
|
|
public static $DATA_MATRIX_FIELD_256; |
|
|
public static $AZTEC_DATA_8; |
|
|
public static $MAXICODE_FIELD_64; |
|
|
|
|
|
private $expTable; |
|
|
private $logTable; |
|
|
private $zero; |
|
|
private $one; |
|
|
private $size; |
|
|
private $primitive; |
|
|
private $generatorBase; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function __construct($primitive, $size, $b) |
|
|
{ |
|
|
$this->primitive = $primitive; |
|
|
$this->size = $size; |
|
|
$this->generatorBase = $b; |
|
|
|
|
|
$this->expTable = []; |
|
|
$this->logTable = []; |
|
|
$x = 1; |
|
|
for ($i = 0; $i < $size; $i++) { |
|
|
$this->expTable[$i] = $x; |
|
|
$x *= 2; |
|
|
if ($x >= $size) { |
|
|
$x ^= $primitive; |
|
|
$x &= $size - 1; |
|
|
} |
|
|
} |
|
|
for ($i = 0; $i < $size - 1; $i++) { |
|
|
$this->logTable[$this->expTable[$i]] = $i; |
|
|
} |
|
|
|
|
|
$this->zero = new GenericGFPoly($this, [0]); |
|
|
$this->one = new GenericGFPoly($this, [1]); |
|
|
} |
|
|
|
|
|
public static function Init() |
|
|
{ |
|
|
self::$AZTEC_DATA_12 = new GenericGF(0x1069, 4096, 1); |
|
|
self::$AZTEC_DATA_10 = new GenericGF(0x409, 1024, 1); |
|
|
self::$AZTEC_DATA_6 = new GenericGF(0x43, 64, 1); |
|
|
self::$AZTEC_PARAM = new GenericGF(0x13, 16, 1); |
|
|
self::$QR_CODE_FIELD_256 = new GenericGF(0x011D, 256, 0); |
|
|
self::$DATA_MATRIX_FIELD_256 = new GenericGF(0x012D, 256, 1); |
|
|
self::$AZTEC_DATA_8 = self::$DATA_MATRIX_FIELD_256; |
|
|
self::$MAXICODE_FIELD_64 = self::$AZTEC_DATA_6; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function addOrSubtract($a, $b) |
|
|
{ |
|
|
return $a ^ $b; |
|
|
} |
|
|
|
|
|
public function getZero() |
|
|
{ |
|
|
return $this->zero; |
|
|
} |
|
|
|
|
|
public function getOne() |
|
|
{ |
|
|
return $this->one; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function buildMonomial($degree, $coefficient) |
|
|
{ |
|
|
if ($degree < 0) { |
|
|
throw new \InvalidArgumentException(); |
|
|
} |
|
|
if ($coefficient == 0) { |
|
|
return $this->zero; |
|
|
} |
|
|
$coefficients = fill_array(0, $degree + 1, 0); |
|
|
$coefficients[0] = $coefficient; |
|
|
|
|
|
return new GenericGFPoly($this, $coefficients); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function exp($a) |
|
|
{ |
|
|
return $this->expTable[$a]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function log($a) |
|
|
{ |
|
|
if ($a == 0) { |
|
|
throw new \InvalidArgumentException(); |
|
|
} |
|
|
|
|
|
return $this->logTable[$a]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function inverse($a) |
|
|
{ |
|
|
if ($a == 0) { |
|
|
throw new \Exception(); |
|
|
} |
|
|
|
|
|
return $this->expTable[$this->size - $this->logTable[$a] - 1]; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function multiply($a, $b) |
|
|
{ |
|
|
if ($a == 0 || $b == 0) { |
|
|
return 0; |
|
|
} |
|
|
|
|
|
return $this->expTable[($this->logTable[$a] + $this->logTable[$b]) % ($this->size - 1)]; |
|
|
} |
|
|
|
|
|
public function getSize() |
|
|
{ |
|
|
return $this->size; |
|
|
} |
|
|
|
|
|
public function getGeneratorBase() |
|
|
{ |
|
|
return $this->generatorBase; |
|
|
} |
|
|
|
|
|
|
|
|
public function toString() |
|
|
{ |
|
|
return "GF(0x" . dechex((int)($this->primitive)) . ',' . $this->size . ')'; |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
GenericGF::Init(); |
|
|
|