Sabtu, 01 Mei 2010

Blum Blum Shub in Delphi

2 days ago there is a friend that ask me about Blum-Blum Shub Random Number Generator method. I can ask her question at that time. So I post the code I got in this blog. Hope this can help.

Source :

procedure TForm1.Blum;

var

xo,i,p,q,start: Integer;

text_datei: TextFile;// ga dipake juga gpp

begin

start:=StrToInt(Form1.Edit1.Text);

p:=StrToInt(Form1.Edit3.Text);

q:=StrToInt(Form1.Edit5.Text);

Writeln(text_datei, 'Hasil');

Writeln(text_datei, 'Start: '+IntToStr(start));

Writeln(text_datei, 'Parameter P: '+IntToStr(p));

Writeln(text_datei, 'Parameter Q: '+IntToStr(q));

Writeln(text_datei, 'N=P*Q: '+IntToStr(p*q));

Writeln(text_datei, ' ');

for i := 1 to StrToInt(Form1.Edit2.Text) do begin

xo:=(start*start) mod (p*q); // start = s

if xo<0>

Form1.Ausgabe(xo);

start:=xo; end;

end;

//ini prosedur untuk menampilkan, baiknya diganti saja

procedure TForm1.Ausgabe(ergebnis: Integer); // ergebnis adalah parameter

begin

Writeln(text_datei ,IntToStr(a)+'. '+IntToStr(ergebnis));

Form1.Memo1.Lines.Append(IntToStr(ergebnis));

a:=a+1;

Form1.count;

end;



Simple Calculator in Delphi



I copy this code from Martin Austermeier, hope this code help you

Calc.pas

unit Calc;

(***********************************************************************

simple calculator for Delphi programs

by Martin Austermeier CIS 100116,3455

Version 1.1 - 10.10.95:

* corrected embarassing subtract bug

* "overflow" error display

* deleted some unnecessary code

--------------------------------------------------------------


This is not a component; just include it with "USES Calc".


Sorry, I don't have the time to write mucho documentation.

Only a few items:

* you might want to change the Form's Caption.


* the calculator is designed to show results with two decimal places.

Look at SetResult (PRECISION, DECIMAL_PLACES) if you want to change this.


* there are only the basic functions.

Not even a "percent" button.. ;-)

If you integrate new buttons, you should set their "Tag" property,

and process them like in CalcButtonClick()


* I invoke the calculator as a modal form (see ShowCalculator).

You'd have to write a Close mechanism if you want to use it as

a non-modal window.


* a typical call would look like

var myNumber : Double;

begin

myNumber := 123.45;

if Calc.Showcalculator(myNumber) then [myNumber has changed];

end;

**********************************************************************)


interface


uses

SysUtils, WinTypes, WinProcs, Messages, Classes,

Forms, Buttons, Controls, StdCtrls, ExtCtrls;


type

TCalcStatus = (CS_FIRST, CS_VALID, { the rest is error stati }

CS_ERROR, CS_OVERFLOW);


type

TCalculator = class(TForm)

MainPanel: TPanel;

DisplayPanel: TPanel;

BottomPanel: TPanel;

Panel3: TPanel;

resultLabel: TLabel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

Button6: TButton;

Button7: TButton;

Button8: TButton;

Button9: TButton;

Button0: TButton;

ButtonComma: TButton;

ButtonDiv: TButton;

ButtonMult: TButton;

ButtonSub: TButton;

ButtonAdd: TButton;

ButtonSign: TButton;

ButtonC: TButton;

ButtonEq: TButton;

okBtn: TBitBtn;

cancelBtn: TBitBtn;

procedure CalcButtonClick(Sender: TObject);

procedure OkBtnClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormKeyPress(Sender: TObject; var Key: Char);

private

{ Private-Declaration }

fResult : Double;

fDisplayText : String[30];

fStatus : TCalcStatus;

operand : Double;

operator : Char;


procedure SetResult(r : Double);

function GetResult : Double;

procedure SetStatus(stat : TCalcStatus);

procedure SetDisplayText(s : String);

function GetDisplayText : String;

property Status : TCalcStatus read fStatus write SetStatus;

property DisplayText : String read GetDisplayText write SetDisplayText;


public

{ Public-Declaration }

property CalcResult : Double read GetResult write SetResult;


procedure Clear;

end;


var

Calculator: TCalculator;


function ShowCalculator(var number : Double) : Boolean;

{ display modal (inital result=number); return "number", if TRUE }


implementation


{$R *.DFM}


function ShowCalculator(var number : Double) : Boolean;

begin

Calculator := TCalculator.Create(application);

try

Calculator.CalcResult := number;

if (Calculator.ShowModal = MROK) then

number := Calculator.CalcResult;

finally

Calculator.Free;

end;

end;



procedure TCalculator.SetResult(r : Double);

const

PRECISION = 15;

DECIMAL_PLACES = 2;

begin

fResult := r;

DisplayText := FloatToStrF(fResult, ffFixed, PRECISION, DECIMAL_PLACES);

end;



function TCalculator.GetResult : Double;

begin

result := StrToFloat(DisplayText);

end;



procedure TCalculator.SetStatus(stat : TCalcStatus);

begin

fStatus := stat;

if (fStatus >= CS_ERROR) then

MessageBeep(MB_ICONSTOP);

end;



procedure TCalculator.SetDisplayText(s : String);

const

MAX_LEN = 17; { max# digits in display }

begin

if (Length(s) <= MAX_LEN) then

resultLabel.Caption := s

else begin

Status := CS_OVERFLOW;

end;

end;



function TCalculator.GetDisplayText : String;

begin

result := resultLabel.Caption;

end;



procedure TCalculator.FormCreate(Sender: TObject);

begin

Clear;

end;



procedure TCalculator.Clear;

begin

Status := CS_FIRST;

DisplayText := '0';

operand := 0;

operator := #0;

end;



procedure TCalculator.CalcButtonClick(Sender: TObject);

var

k : Char;

begin

if (Sender is TButton) then begin

ButtonEq.SetFocus; { default button }

k := Char(TButton(Sender).Tag);

FormKeyPress(Sender, k);

end;

end;



procedure TCalculator.OkBtnClick(Sender: TObject);

var

k : Char;

begin

k := '=';

FormKeyPress(self, k); { simulate "=" to get result }

end;



procedure TCalculator.FormKeyPress(Sender: TObject; var Key: Char);

const

KEY_SIGN = '#';

KEY_CLEAR = 'C';

KEY_DECIMAL = '.';


ERR_TXT = 'Error';

OFL_TXT = 'Overflow';


var

k : Char;

begin

k := UpCase(key);


if (k = decimalSeparator) then

k := KEY_DECIMAL;


if (Status <>

or (k = KEY_CLEAR) then

case k of

'0'..'9': begin

if (Status = CS_FIRST) or (DisplayText = '0') then

DisplayText := '';

Status := CS_VALID;

DisplayText := DisplayText + k;

end;


#8 : begin

if (Length(DisplayText) > 0) then begin

DisplayText := Copy(DisplayText, 1, Length(DisplayText)-1);

if (Length(DisplayText) = 0) then

DisplayText := '0';

Status := CS_VALID;

end;

end;


KEY_DECIMAL: begin

if (Pos(decimalSeparator, DisplayText) = 0) then

DisplayText := DisplayText + decimalSeparator;

Status := CS_VALID;

end;


'+', '-', '/', '*', '=' : begin

case operator of

'+': begin

CalcResult := operand + CalcResult;

end;


'-': begin

CalcResult := operand - CalcResult;

end;


'*': begin

CalcResult := operand * CalcResult;

end;


'/': begin

if (CalcResult = 0) then

Status := CS_ERROR

else

CalcResult := operand / CalcResult;

end;


end;


if (Status <> CS_ERROR) then begin

Status := CS_FIRST;

operand := CalcResult;

operator := k;

end;

end;


KEY_SIGN: begin

CalcResult := -CalcResult;

end;


KEY_CLEAR: begin

Clear;

end;


end;


case Status of { in case of error.. }

CS_ERROR : DisplayText := ERR_TXT;

CS_OVERFLOW : DisplayText := OFL_TXT;

end;

end;



end.


Program Project1

program Project1;


uses

Forms;


{$R *.res}


begin

Application.Initialize;

Application.Run;

end.


And the result is :