Avatar billede penta Nybegynder
20. oktober 2003 - 12:47 Der er 39 kommentarer og
1 løsning

Hvor lang tid tager det at multiplicere 2262 store tal sammen?

Jeg benytter dynamiske tabeller og pointere til at multiplicere store tal. Er der nogen der kan fortælle mig hvor lang tid det ca. bør tage at multiplicere alle primtal mellem 2 og 20000(der er 2262 primtal)? Min Cpu er en 900 Mhz.

Findes der en hurtigere metode eller ?
Avatar billede hermandsen Juniormester
20. oktober 2003 - 12:51 #1
Kan du ikke bare teste det!?

var
  C: Cardinal;
begin
  C := GetTickCount; //GetTickCount returnerer antallet af milisekunder siden Windows blev startet.
  LavEnMasseBeregninger(12343245);
  C := GetTickCount - C;
  ShowMessage('Beregningerne tog ' + IntToStr(C) + ' milisekunder.');
end;

//hermandsen
Avatar billede penta Nybegynder
20. oktober 2003 - 12:58 #2
Problemet er at jeg jo gerne vil vide om det kan passe, at det tager så lang tid at beregne. Tiden har jeg holdt for mig selv, fordi jeg gerne vil vide hvor lang tid nogle af jer mener det bør tage? Bør det tage under 5 min, under en halv time, en time eller ?????
Avatar billede stoney Nybegynder
20. oktober 2003 - 13:40 #3
PÅ min gamle 600 Mhz tager det 20 milli-sekunder 

Stoney
Avatar billede penta Nybegynder
20. oktober 2003 - 13:54 #4
20 milli-sekunder hmmm det var kort tid...og så ender du med et resultat på mange cifre ?
Avatar billede stoney Nybegynder
20. oktober 2003 - 14:07 #5
procedure TForm1.Button1Click(Sender: TObject);
var
i,resultat : integer;
C: Cardinal;

begin
C := GetTickCount;
resultat := 1;
for i := 2 to 20000 do
begin
if isprime(i) then
resultat := resultat * i;

end;
C := GetTickCount - C;
  ShowMessage('Beregningerne tog ' + IntToStr(C) + ' milisekunder.');
  showmessage(inttostr(resultat));
end;

Stoney
Avatar billede penta Nybegynder
20. oktober 2003 - 14:16 #6
Når jeg har ganget tallene, til og med Primtallet 37, så har jeg et resultat der ser sådanne ud. 7420738134810...og hvis resultatet skal være en integer??
Du må få en fejl undervejs?
Avatar billede stoney Nybegynder
20. oktober 2003 - 14:44 #7
Jeg får 4693139312821112818 med primtal fra 2- 20000

resultat skal være int64 og IKKE integer

Stoney
Avatar billede snowball Novice
20. oktober 2003 - 14:51 #8
Beregningerne tog 1732 milisekunder.
Resulatat: 4693139312821112818

Lavet på en 533MHz med 265MB RAM

Snowball
Avatar billede penta Nybegynder
20. oktober 2003 - 14:54 #9
Hvis jeg ganger alle primtal mellem 2 og 20000, får jeg et resultat der er på mere end 8000 cifre....det er derfor jeg benytter tabeller og pointere??!
Avatar billede stoney Nybegynder
20. oktober 2003 - 15:01 #10
penta > du må gøre et eller andet forkert.
Forkerte tabeller, pointere whatever ?

Læg mærke til Snowballs og mit resultat er identiske

Stoney
Avatar billede stoney Nybegynder
20. oktober 2003 - 15:01 #11
Vil du have en liste over primtallene ?

Stoney
Avatar billede snowball Novice
20. oktober 2003 - 15:08 #12
stoney: Tror penta har ret. Prøv og skriv de fundne primtal og melleregningerne ud. resultatet går jo i minus flere gange hvilke det jo ikke burde, men kun gør fordi en Int64 åbenbart ikke er stor nok (hvad er større !?)

  C := GetTickCount;
  resultat := 1;
  Memo1.Clear;
  for i := 2 to 20000 do begin
    if isprime(i) then Begin
      Memo1.Lines.Add('Primtal fundet: ' + IntToStr(i));
      Memo1.Lines.Add('Temp. resultat: ' + IntToStr(resultat));
      resultat := resultat * i;
    end;
  end;
  C := GetTickCount - C;

  Memo1.Lines.Add('Beregningerne tog ' + IntToStr(C) + ' millisekunder.');
  Memo1.Lines.Add('Resultat: ' + IntToStr(resultat));

Snowball
Avatar billede snowball Novice
20. oktober 2003 - 15:13 #13
Det største tal en Int64 kan indeholde er jo 9223372036854775807 og det overskrider vi jo allerede inden vi når til primtal der ligger over 60 !

Så vidt jeg ved findes der ikke lige noget større end Int64 !?

Snowball
Avatar billede penta Nybegynder
20. oktober 2003 - 15:16 #14
Nej tak. Jeg har en liste over samtlige primtal mellem 2 og 20000.
Hvis jeg tager en almindelig lommeregner får jeg:
(2*3*5*7*9*11*13*17*19*23*29*31*37*41*43*47)= 5534008043296422690
Dvs. jeg har ganget 16 af de 4203 primtal der findes mellem 2 og 20000. Dette giver et resultat på 19 cifre. Så mangler jeg kun at gange resultatet med de resterende 4184 primtal...og det siger I alt i alt skal give et resultat på  19 cifre...det kan jeg ikke få til at passe.
Avatar billede borrisholt Novice
20. oktober 2003 - 15:21 #15
Problemet er at der ikke er plads i en alm INt64, Det bliver jo et enormt tal... Hvad skal du bruge det til ?
Avatar billede penta Nybegynder
20. oktober 2003 - 15:25 #16
Jeg forsøger at lave et program der kan lave en form for krypteringskode...altså et meget stort primtal ganget med et meget stort primtal.
Avatar billede penta Nybegynder
20. oktober 2003 - 15:27 #17
...ikke fordi jeg har så meget forstand på det, men jeg prøver.
Avatar billede borrisholt Novice
20. oktober 2003 - 15:48 #18
Hvis du skal lave kryptering, så start på et niveau hvor du kan være med ....

Tilbage til dit SPM. Jeg har lige lavet en test.

På "min" computer en p4 1620 Mhz skal jeg bruge 343 ms på at generer de 2262 primtal, og ydligere 1 ms på at gange dem sammen.

Det tager "ingen" tid at gange dem sammen, assembler instruktionen imul bruger kun en enkelt instruktion på at gange to heltal sammen. det har den gjort siden P2. Derfor giver det ikke meningen at tage tid på så lille et regne stykke, 2262 er ikke ret meget !

Hvis dit regne stykke tager langtid, er det fordi du bruger langtid på dine primtal.

Jens B
Avatar billede borrisholt Novice
20. oktober 2003 - 15:49 #19
Her er lidt hjælp til kryptering ;

unit Tools;

interface

uses
  Sysutils, Classes;

procedure FastCrypt(ptrBuffer: Pointer; iSize: Integer; uiInit: Byte = $00);
procedure FastDeCrypt(ptrBuffer: Pointer; iSize: Integer; uiInit: Byte = $00);

implementation

procedure FastCrypt(ptrBuffer: Pointer; iSize: Integer; uiInit: Byte = $00);
var
  iIdx      : Integer;
  uiCurrByte : Integer;
  uiLastByte : Integer;
begin
  uiLastByte := 0;

  for iIdx := 1 to iSize do
  begin
    uiCurrByte := Byte(ptrBuffer^);
    uiCurrByte := uiCurrByte xor uiLastByte;
    uiCurrByte := not uiCurrByte;
    uiCurrByte := uiCurrByte xor uiInit;
    uiCurrByte := ((uiCurrByte and $0F) shl 4) or ((uiCurrByte and $F0) shr 4);
    uiLastByte := uiCurrByte;
    Char(ptrBuffer^) := Char(uiCurrByte);
    inc(pChar(ptrBuffer));
  end;
end;

procedure FastDeCrypt(ptrBuffer: Pointer; iSize: Integer; uiInit: Byte = $00);
var
  iIdx      : Integer;
  uiCurrByte : Byte;
  uiLastByte : Byte;
begin
  uiLastByte := 0;
  for iIdx := 1 to iSize do
  begin
    uiCurrByte := Byte(ptrBuffer^);
    uiCurrByte := ((uiCurrByte and $0F) shl 4) or ((uiCurrByte and $F0) shr 4);
    uiCurrByte := uiCurrByte xor uiInit;
    uiCurrByte := not uiCurrByte;
    uiCurrByte := uiCurrByte xor uiLastByte;
    uiLastByte := Byte(ptrBuffer^);
    Char(ptrBuffer^) := char(uiCurrByte);
    inc(pChar(ptrBuffer));
  end;
end;


end.


Jens B
Avatar billede borrisholt Novice
20. oktober 2003 - 15:59 #20
Det der taget de mange ms er at skrive dem ud i en Memo ... Hvis jeg ikke skal skrive dem ud så tager der under 1 ms for det hele
Avatar billede stoney Nybegynder
20. oktober 2003 - 16:01 #21
jens > køb en ny PC eller optimer din kode.
Det tager kun 31 msek på min p600 at finde dem og putte dem i en Tstringlist.

-:)

Stoney
Avatar billede borrisholt Novice
20. oktober 2003 - 16:05 #22
Stoney .. Prøv samme trick, blot med en Tlist ....
Avatar billede borrisholt Novice
20. oktober 2003 - 16:07 #23
Jeg er nede på 15 ms for at lave dem samt putte dem i  en TList !

Jens B
Avatar billede stoney Nybegynder
20. oktober 2003 - 16:17 #24
Ved Tlist ender jeg på
20 ms på en P3 600 mhz

Stoney
Avatar billede penta Nybegynder
20. oktober 2003 - 16:21 #25
Ok jeg er stået af, men siger tak for hjælpen alle sammen. Jens B kunne du ikke give et "svar", så du kan få dine berettigede point. Jeg opretter et nyt spørgsmål...for dette bliver vist ikke til mere. Jeg må jo finde ud af hvad jeg gør forkert. Men Jens B jeg vil meget gerne høre fra dig i mit næste indlæg, for jeg synes du har fat i noget interessant og tager mit spørgsmål seriøst, dejligt:) Jeg har meget at lære endnu :=)
Avatar billede stoney Nybegynder
20. oktober 2003 - 16:26 #26
penta> jeg tager dig skam også alvorligt, det er bare sjovt
at drille Jens. Gruppens Alpha-han skal altid udfordres.

:-)

Steen
Avatar billede penta Nybegynder
20. oktober 2003 - 16:35 #27
Det er bare helt i orden stoney. Ingen problemer der :)
Avatar billede borrisholt Novice
20. oktober 2003 - 17:01 #28
Ingen points til mig, stoney trænger mere end jeg gør. Til points .. Skulle nogen være i tvivl ?

Jens B
Avatar billede borrisholt Novice
20. oktober 2003 - 17:04 #29
snowball >> Du er da vist ikke helt kvik her til morgen hva ?

afslør nu for den måbende hob hvorfor det giver minus på "halv vejen"

Jens B
Avatar billede penta Nybegynder
20. oktober 2003 - 18:04 #30
Jamen der er jo en grund til at at du har alle de point. Du har vel fortjent dem...og hvad du så herefter vil gøre med dine point, det blander jeg mig ikke i.
Avatar billede borrisholt Novice
21. oktober 2003 - 08:09 #31
OKI ... så får du et svar :-)

Jens B
Avatar billede penta Nybegynder
21. oktober 2003 - 12:41 #32
Tak Mester Borrisholt...ikke så beskeden :)
Avatar billede borrisholt Novice
21. oktober 2003 - 13:14 #33
penta >> Jammen tak da ... Jeg synes blot ikke vi helt har fået belyst problemet .....

Du har 2262 heltal du skal have ganget sammen. Det taget altså under 1 ms, uanset hvad.

Og det faktum har jeg på peget i går, og det er der ingen der har haft noget at føje til. altså må jeg have ret ? (igen)

Ærgo, er der for mig at se kun din primtals algoritme tilbage, som kan tage tiden for dig ! Den har vi ikke hørt eller set meget til !

Endvidere har jeg svært ved at se hvorfor du ikke sætter dig ind i noget allerede eksisterende kryptering ?

På min, nu vist lidt stører computer kan jeg generer de 2262 primtal og gange dem sammen på under 1 ms. Så prcos hvad du har gang i er svært at sige.

Jens B
Avatar billede hermandsen Juniormester
21. oktober 2003 - 13:27 #34
Her er lidt primtals-fætter-guf:
http://www.swissdelphicenter.ch/en/showcode.php?id=914
http://www.swissdelphicenter.ch/en/showcode.php?id=1210

Hvis det var noget du ville ha' optimeret...
Avatar billede borrisholt Novice
21. oktober 2003 - 14:03 #35
hermandsen >> Assembler fuktionen virker ikke. Den anden er sløv !

Jens B
Avatar billede borrisholt Novice
21. oktober 2003 - 14:08 #36
Og så regner den i øvrigt forkert

Jens B
Avatar billede borrisholt Novice
21. oktober 2003 - 14:09 #37
Den fra 1210 er også den jeg bruger.

Jens B
Avatar billede penta Nybegynder
21. oktober 2003 - 14:35 #38
Det var min multiplikation der var problemet.
Jens B>> Grunden til I ikke har hørt mere om generering af primtallene er: Jeg genererer primtallene, gemmer dem og ved et klik på en knap - begynder multiplikationen og det er så dennes tid jeg har været interesseret i.
Avatar billede penta Nybegynder
21. oktober 2003 - 14:37 #39
Jeg vil lave et program der kan lave en krypteringkode. Men du har ret, jeg bør nok undersøge noget mere.
Avatar billede penta Nybegynder
21. oktober 2003 - 14:39 #40
Jeg har nu fået optimeret min kode, og det går en del stærkere. Jeg har som sagt meget at lære endnu :)
Endnu en gang mange tak for hjælpen-
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester