Added TBigIntPolynomial.ScaleVariableByPowerOfTwo

This commit is contained in:
Stefan Müller 2024-05-26 16:59:16 +02:00
parent ab453b347d
commit 04e1702a2e
2 changed files with 28 additions and 0 deletions

View File

@ -46,6 +46,9 @@ type
// Returns f(s * x), given a polynomial f(x) and scale factor s. // Returns f(s * x), given a polynomial f(x) and scale factor s.
function ScaleVariable(const AScaleFactor: TBigInt): TBigIntPolynomial; function ScaleVariable(const AScaleFactor: TBigInt): TBigIntPolynomial;
// Returns f(2^n * x), given a polynomial f(x) and an exponent n.
function ScaleVariableByPowerOfTwo(const AExponent: Cardinal): TBigIntPolynomial;
// Returns f(x / 2), given a polynomial f(x). // Returns f(x / 2), given a polynomial f(x).
function ScaleVariableByHalf: TBigIntPolynomial; function ScaleVariableByHalf: TBigIntPolynomial;
@ -144,6 +147,21 @@ begin
end; end;
end; end;
function TBigIntPolynomial.ScaleVariableByPowerOfTwo(const AExponent: Cardinal): TBigIntPolynomial;
var
len, i: Integer;
shift: Cardinal;
begin
len := Length(FCoefficients);
SetLength(Result.FCoefficients, len);
Result.FCoefficients[0] := FCoefficients[0];
shift := AExponent;
for i := 1 to len - 1 do begin
Result.FCoefficients[i] := FCoefficients[i] << shift;
Inc(shift, AExponent);
end;
end;
function TBigIntPolynomial.ScaleVariableByHalf: TBigIntPolynomial; function TBigIntPolynomial.ScaleVariableByHalf: TBigIntPolynomial;
var var
len, i: Integer; len, i: Integer;

View File

@ -42,6 +42,7 @@ type
procedure TestSignVariations; procedure TestSignVariations;
procedure TestScaleByPowerOfTwo; procedure TestScaleByPowerOfTwo;
procedure TestScaleVariable; procedure TestScaleVariable;
procedure TestScaleVariableByPowerOfTwo;
procedure TestTranslateVariableByOne; procedure TestTranslateVariableByOne;
procedure TestRevertOrderOfCoefficients; procedure TestRevertOrderOfCoefficients;
procedure TestDivideByVariable; procedure TestDivideByVariable;
@ -143,6 +144,15 @@ begin
AssertTrue('Polynomials are not equal.', a = b); AssertTrue('Polynomials are not equal.', a = b);
end; end;
procedure TBigIntPolynomialTestCase.TestScaleVariableByPowerOfTwo;
var
a, b: TBigIntPolynomial;
begin
a := TBigIntPolynomial.Create([10, 7, 5, 1034]).ScaleVariableByPowerOfTwo(5);
b := TBigIntPolynomial.Create([10, 7 * 32, 5 * 32 * 32, 1034 * 32 * 32 * 32]);
AssertTrue('Polynomials are not equal.', a = b);
end;
procedure TBigIntPolynomialTestCase.TestTranslateVariableByOne; procedure TBigIntPolynomialTestCase.TestTranslateVariableByOne;
var var
a, b: TBigIntPolynomial; a, b: TBigIntPolynomial;