liczby fermata

0

Czy mógłby ktoś powiedzieć dlaczego to mi nie działa? Po raz pierwszy korzystam z funkcji power i myślę, że tam mogę robić błąd, ale nie jestem pewna... Proszę o podpowiedź :)

Polecenie było takie:
Napisz program znajdujący wszystkie liczby pierwsze Fermata.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math;

var
a,b,                                                //podany przedzial
m,n
:Integer ;
x,y,z: Extended ;

begin
writeln('***LICZBY PIERWSZE FERMATA***');
writeln;
writeln('Podaj dolna granice przedzialu');
readln(a);
writeln('Podaj gorna granice przedzialu');
readln(b);

for n:=1 to 1000 do
    begin
    x:=power(2,n) ;
    y:=power(2,x) ;
    z:=y+1 ;

      if z>a then
      begin
        if z<b then

      writeln(x) ;
end;  end;

writeln('To liczby Fermata znajdujace sie w podanym przedziale') ;
readln;


end.

Coś chyba ostro namieszałam... ;/

0

Ty chcesz na standardowym typie liczbowym policzyć 21000?

0

Wynik działania programu zwraca liczby znacznie przekraczające wartość maksymalnej dopuszczalnej w języku programowania liczby naturalnej. Do takich obliczeń trzeba użyć specjalnej biblioteki umożliwiającej działania na olbrzymich liczbach naturalnych. Gdzieś widziałem taką bibliotekę ale nie mogę sobie przypomnieć gdzie.

0

Fakt, nie pomyślałam... Ten 1000 tam się pojawił tylko dlatego bo nie wiedziałam co wpisać na razie jako górną granicę n. Zmieńmy to na sto :) I nadal nie działa... Help :)

0

Tutaj jest taka biblioteka z dokumentacją:
http://gmplib.org/
Napisana jest w języku C ale może mają gotowy dll z opisem wyprowadzonych na zewnątrz funkcji (external), więc po odpowiedniej konwersji typów użycie jej będzie równie proste jak API windowsa.

0

Czyli program nie działa tylko ze względu na bibliotekę? Ja na studiach na razie miałam trzy godziny z zastępcą związane z programowanie w delphi, więc wydaje mi się, że zabawa bibliotekami, pisanie ich bla bla, jest trochę zbyt skomplikowane...

0

Do sprawdzenia czy liczba Fermata Fn jest pierwsza skorzystaj z twierdzenia: Jeśli m = ( Fn - 1 ) / 2 to Fn jest pierwsza wtedy i tylko wtedy, gdy dzieli 3m + 1.
Nie wiem czy wiesz, że problem Ile jest liczb pierwszych Fermata jest nierozwiązany? Dostałaś bardzo ambitne zadanie.

0

Wiem, zauważyłam to w wikipedii :P

W takim razie podejdę do programu na nowo, skorzystam z tego co mi napisałeś i dam znać, czy działa :) Wychodzi na to, że od początku źle kombinowałam... Wielkie dzięki :)

0
Wikipedia napisał(a)

Do chwili obecnej jedynymi znanymi liczbami pierwszymi Fermata są właśnie F0, F1, F2, F3, F4 i nie wiadomo, czy jest ich więcej.

No to teraz zadanie się upraszcza :P

Extended to nie typ całkowity. Jedynymi liczbami Fermata, które mieszczą się w zwykłych typach liczbowych to F0, F1, F2, F3, F4 i ewentualnie F5 na liczbach 64-bitowych.

Wikipedia napisał(a)

W chwili obecnej (2004) wiadomo, że dla 5 ≤ n ≤ 32 wszystkie liczby Fn są złożone.

Liczba F33 przy zapisie jako tablica bajtów, słów czy czego tam jeszcze zajmowałaby minimum 1 GiB.

Tak, że pętla powinna iść od 0 do 4.

0

Funkcji "power" też nie można używać, bo operuje na liczbach rzeczywistych. Potęgowanie można uzyskać przez wielokrotne mnożenie w pętli, przy czym długość pętli byłaby zmienna i ustalana w zależności od ilości potrzebnych mnożeń.

0

Działa, podaje dobre wyniki i wgl :) Tylko jeden problem - od razu mi się zamyka. Mógłby ktoś rzucić okiem i sprawdzić z jakiego powodu?

    program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math;




var
a,b,                                                //podany przedzial
m,n
:Integer ;
x,y,z: Extended ;

begin
writeln('***LICZBY PIERWSZE FERMATA***');
writeln;
writeln('Podaj dolna granice przedzialu');
readln(a);
writeln('Podaj gorna granice przedzialu');
readln(b);
writeln;
begin
for n:=0 to b do
    begin
    x:=power(2,n) ;

    y:=power(2,x) ;

    z:=y+1 ;
      begin
      if z>=a then
      begin
        if z<=b then
      begin
      writeln(trunc(z))  ;
  
end;  end; end;  end;  end;
writeln('To liczby pierwsze Fermata');
 readln;
end.
0

masakryczne formatowanie kodu (a na "end; end; end; end; end;" brakuje mi epitetu).
na końcu kodu masz readln, po drodze nie ma exita ani halta, więc jedynym wytłumaczeniem Twojego problemu jakie widzę, jest to, że nie przekompilowałaś kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1