summaryrefslogtreecommitdiff
path: root/pseudohadamard.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-07-10 15:10:15 +0200
committerErich Eckner <git@eckner.net>2015-07-10 15:20:53 +0200
commitffb35ffece4f0239cf9fcecbfba5329d7b5dc98d (patch)
treebc07a061ee40ed18106cd5a13528d074d1228960 /pseudohadamard.pas
parentaddd58de0c9311f791355231d53e4b280ff3537d (diff)
downloadunits-ffb35ffece4f0239cf9fcecbfba5329d7b5dc98d.tar.xz
neue Dateien: matheunit.pas, mlockunit.pas, mystringlistunit.pas,
pseudohadamard.pas, randomunit.pas, systemunit.pas
Diffstat (limited to 'pseudohadamard.pas')
-rw-r--r--pseudohadamard.pas59
1 files changed, 59 insertions, 0 deletions
diff --git a/pseudohadamard.pas b/pseudohadamard.pas
new file mode 100644
index 0000000..654dc0e
--- /dev/null
+++ b/pseudohadamard.pas
@@ -0,0 +1,59 @@
+unit pseudohadamard;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, Gmp, Math;
+
+procedure pseudoHadamardTransformation(var daten: array of mpz_t; modul: mpz_t; invers: boolean); overload;
+procedure pseudoHadamardTransformation(var daten: array of mpz_t; Ordnung, Verschiebung: longint; modul: mpz_t; var buff: mpz_t; invers: boolean); overload;
+
+implementation
+
+procedure pseudoHadamardTransformation(var daten: array of mpz_t; modul: mpz_t; invers: boolean);
+var
+ buff: mpz_t;
+begin
+ if length(daten)<>round(power(2,round(ln(length(daten))/ln(2)))) then
+ raise Exception.create('Die Länge der Daten für eine Pseudohadamardtransformation muss eine Zweierpotenz sein! (und nicht '+inttostr(length(daten))+'!)');
+ mpz_init(buff);
+ pseudoHadamardTransformation(daten,length(daten),0,modul,buff,invers);
+ mpz_clear(buff);
+end;
+
+procedure pseudoHadamardTransformation(var daten: array of mpz_t; Ordnung, Verschiebung: longint; modul: mpz_t; var buff: mpz_t; invers: boolean);
+var
+ i: longint;
+begin
+ Ordnung:=Ordnung div 2;
+ if Ordnung>1 then
+ for i:=0 to 1 do
+ pseudoHadamardTransformation(daten,Ordnung,Verschiebung + i*Ordnung,modul,buff,invers);
+
+ if invers then begin
+ for i:=0 to Ordnung-1 do begin
+ mpz_set(buff,daten[Verschiebung+i]);
+ mpz_sub(daten[Verschiebung+i],daten[Verschiebung+i],daten[Verschiebung+i+Ordnung]); // a = a' - b
+ mpz_mod(daten[Verschiebung+i],daten[Verschiebung+i],modul);
+
+ mpz_mul_ui(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],2); // b = 2*b'
+ mpz_sub(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],buff); // - a'
+ mpz_mod(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],modul);
+ end;
+ end
+ else
+ for i:=0 to Ordnung-1 do begin
+ mpz_set(buff,daten[Verschiebung+i]);
+ mpz_mul_ui(daten[Verschiebung+i],daten[Verschiebung+i],2); // a' = 2 * a
+ mpz_add(daten[Verschiebung+i],daten[Verschiebung+i],daten[Verschiebung+i+Ordnung]); // + b
+ mpz_mod(daten[Verschiebung+i],daten[Verschiebung+i],modul);
+
+ mpz_add(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],buff); // b' = a + b
+ mpz_mod(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],modul);
+ end;
+end;
+
+end.
+