ПРОГРАММА «Простые 1»

ОГЛАВЛЕНИЕ

1. Общее
2. Математика
3. Вывод
4.  Анализ результатов
5. Примеры многочленов
6.  Скачать программу «Простые 1»

Приложение 1
Распечатка программы «Простые 1»

1. Общее
Не всем дано доказывать теоремы.
Но каждый может внести что-то новое в науку при помощи компьютера.
Моделируя ситуации в разных областях науки.
Это интересней, чем компьютерные игры, которые, по сути, пустая трата времени.
Но для моделирования всяких ситуаций надо владеть какими-то познаниями в программировании. Изучение современных языков трудностей не представляет.
Так для овладения языком Дельфи 7 достаточно месяца три.

2. Математика
Многие многочлены в определенном диапазоне x дают последовательность простых чисел.
Об этом, например, a*x*x +b*x +c   
http://vlad-utenkov.narod.ru/personal2/ … /pr/pr.htm
Наиболее известный многочлен такого вида открыт Эйлером:
x*x - x + 41
В программе «Простые 1» собирается статистика по значениям квадратных многочленов
a*x*x +b*x +c   в диапазоне от 1 до n.

Статистика собирается для двух многочленов:
a*i*i +b*i +c   и a1*i*i+b1*i +c1
где i текущая переменная от 1 до n
a, b, c, a1, b1, c1 и n  задаются, как const, в тексте программы.
Такая же статистика и для ряда натуральных чисел.

3. Вывод
Массивы
s1:   array [1..n] of integer;// значения многочлена № 1
s2:   array [1..n] of integer;//  1 -простое число, 0 - составное число
//   многочлен № 1
     s3:   array [1..n] of integer;// значения многочлена № 2
s4:   array [1..n] of integer;// 1 -простое число, 0 - составное число
     //   многочлен № 21
           s5:   array [1..n] of integer;// простые числа натурального ряда
s6:   array [1..n] of integer;//   составные числа натурального ряда
       s7:   array [1..n] of integer;//ряд простых чисел
s8:   array [1..50] of integer;// сравнение максимальных
              //цепей простых чисел в многочленах  №1 и №2,
// Если длина цепей одинакова

const
          n =10000;// число вычислений значений многочленов  и ряда натуральных чисел
                 // многочлен Эйлера
            a=1;
          b = -1;
           c=41;
          // двойник многочлена Эйлера
        a1= 4;
      b1= -258 ;
      c1=4201  ;

Переменные
a= 1   -первый коэффициент многочлена
b= -1 – второй коэффициент многочлена
  c=  41 – третий коэффициент многочлена
v=  0   - равна 0, если все величины многочлена больше нуля.
Если величина многочлена меньше или равна нулю,   v равно текущему i(x)
z1=  4149  - число простых
  z2=  5851  - число составных
w=  40 – максимальная длина цепи из простых
  m=  0 -  текущее величина цепи из простых
   j1=  40   - величина i в конце максимальной цепи из простых
   j2= 1    - величина i в начале максимальной цепи из простых
s=  19  - максимальная длина цепи из составных
  t=  2   - текущее величина цепи из составных 
   u1=  9283  - величина i в конце максимальной цепи из составных
   u2= 9265 - величина i в начале максимальной цепи из простых
  y1= 9999 – величина i для последнего простого из n величин многочлена
  s2[n]= 0
  d1= 262125,82080 – средняя величина  значений многочлена
  h1= 0,4149 – отношение числа простых к n

Вывод для многочлена №2 и ряда натуральных чисел аналогичен

Ряд  простых чисел
n4=   5736397 – сумма простых
   z7=   1230   - число простых
d4= 4663,73740  - средняя величина простого

4.  Анализ результатов
4.1. Последовательности от многочленов можно сравнивать по доле простых.
В натуральном ряду среди первых 10000 доля простых – 0,123
4.2. Подбором коэффициентов многочлена можно получить последовательность без простых.
Например, все члены последовательности делятся на 2 или 3.
4.3. Имеется многочлена с простыми и составными, но доля простых мала.
Например
h2= 0,047
       a1=1;
  b1= -3 ;
   c1=17  ;
4.4.  Многочлен Эйлера даёт последовательность в 40 простых чисел при изменении x от1 до 40.
Величины простых чисел возрастают, но их последовательность не совпадает с последовательностью простых натурального ряда.
Для удобства сравнения во множестве простых натурального ряда  простые даны с 41, как и для многочлена Эйлера.
4.5. Найден двойник многочлена Эйлера.
   a1= 4;
   b1= -258 ;
      c1=4201 
При n=10000 доля простых для многочлена Эйлера  - 0, 4149, для двойника – 0, 3802

Тоже цепочка из 40 простых, но при x = 13-52
Величины многочлена в этом диапазоне те же, что и для многочлена Эйлера, но порядок другой.
Результат сравнения множество  s8.

5. Примеры многочленов
// многочлен Эйлера
            a=1;
          b = -1;
           c=41;

          // двойник многочлена Эйлера
     //   a1= 4;
  // b1= -258 ;
   //   c1=4201  ;
                   // двойник многочлена Эйлера
          //   a1= 1;
  //  b1= -3 ;
  //   c1=43  ;

   // нет  простых, только чётные
   //     a1= 1;
// b1= -5 ;
  //  c1=40  ;
          //мало простых    половина чётных
//   a1= 1;
// b1= -8 ;
  //  c1=41  ;
  /// очень мало простых половина чётных
       //  a1= 2;
//  b1= -3 ;
//   c1=39  ;

// простых нет все значения делятся на три
   //    a1=3;
// b1= -3 ;
  //  c1=39  ;
  // мало простых      h2= 0,047
    //    a1=1;
//  b1= -3 ;
  // c1=17  ;

6.  Скачать программу «Простые 1»
https://disk.yandex.ru/d/SVq4kurS6Eo6Ug

Приложение 1
Распечатка программы «Простые 1»
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button5: TButton;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    Edit1: TEdit;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label3: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;

    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

          const
          n =10000;// число вычмислений значений многочленов

                 // многочлен Эйлера
            a=1;
          b = -1;
           c=41;

          // двойник многочлена Эйлера
     a1= 4;
  b1= -258 ;
      c1=4201  ;
                   // двойник многочлена Эйлера
          //   a1= 1;
  //  b1= -3 ;
  //   c1=43  ;

   // нет  простых, только чётные
   //     a1= 1;
// b1= -5 ;
  //  c1=40  ;
          //мало простых    половина чётных
//   a1= 1;
// b1= -8 ;
  //  c1=41  ;
  /// очень мало проствых половина чётных
       //  a1= 2;
//  b1= -3 ;
//   c1=39  ;

// простых нет все занчения делятся на три
   //    a1=3;
// b1= -3 ;
  //  c1=39  ;
  // мало простых      h2= 0,047
    //    a1=1;
//  b1= -3 ;
  // c1=17  ;

      var
       Tick: Cardinal;

s1:   array [1..n] of integer;// значения многочлена № 1
s2:   array [1..n] of integer;//  1 -простое число, 0 - составное число
//   многочлен № 1
     s3:   array [1..n] of integer;// значения многочлена № 2
s4:   array [1..n] of integer;// 1 -простое число, 0 - составное число
     //   многочлен № 21
           s5:   array [1..n] of integer;// простые числа натурального ряда
s6:   array [1..n] of integer;//   составные числа нарурального ряда
       s7:   array [1..n] of integer;//ряд простых чисел
              s8:   array [1..50] of integer;// сравнение максимальных
              //цепей простых чисел в многочленах  №1 и №2
r,w, w1, w2, k,  f,g, h, ha,q,i,j : integer; //
j1,j2,j3,j4,j5,j6,j7,j8,i2,i1, i3,i4,i5,i6,i7,i8,i9,i0, l: integer; //
  x1, x2, z,z1, z2, z3, z4,z5, z6,z7,  v,v1,v2, e: integer;//
m, m1, m2, mm, a2,m3,m4,m5 ,vv: integer;//
y, y1, y2,y3, d, p, s, t, u1,u2 , p1, t1, u3,u4 : integer;//
   h1,h2,h3: variant;//
   n1, n2, n3,n4    : cardinal;//
   d1, d2, d3, d4     : variant;   //

   // Функция нахождения простых чисел
     // По книге    Жуков "Программируем в Delphi"
       function good(Numb:integer):boolean;
     var
     i:integer;
     begin
          Form1.Caption:=IntToStr(GetTickCount-Tick);
     good:= true;
    for i:=2 to Trunc(Sqrt(Numb)) do
   if (Numb mod i) =0  then
     begin
      good := false;
      exit;
      end; end;

procedure TForm1.Button1Click(Sender: TObject);
// окантовка
begin
        Form1.Caption:=IntToStr(GetTickCount-Tick);
    for q:=1 to n //нумерация по горизонтали в табл №1 ,
     do StringGrid2.Cells[q,0]:=IntToStr(q);
       for q:=1 to n   // нумерация по вертикали  в табл №1 ,
     do   StringGrid2.Cells[0,q]:=IntToStr(q);

            ////////////////// a b c
   for i:=1 to n   do
      begin
        Form1.Caption:=IntToStr(GetTickCount-Tick);
        s1[i]:=   (a*i*i + b*i + c)  ;
        if s1[i]<=0 then begin v:=i; break
       end; end;

        for j:= 1 to N do  begin
       IF S1[j]> 0 then
             if good (s1[j]) then
              begin
                Form1.Caption:=IntToStr(GetTickCount-Tick);
               s2[j]:=1 ; z1:= z1+1; end
        else  begin s2[j]:=0;  z2:= z2+1;
                    end;    end;
                            // простые - многочлен № 1
                  for i:=1 to n do  begin
                  if s2[i]=1 then m:=m+1 ;
                  if s2[i] =0 then begin
                  if m>w then
             begin      w:=m;      j1:= i-1;end;
                     m:=0
                   end;
                     end;
                     //end;
                         j2 := j1-w+1;
                                   //составные - многочлен № 1
                        for i:=1 to n do  begin
                           if ((s2[i-1] =1) and  (s2[i] =0)) then y1 := i ;
                                      if s2[i]=0 then  t:=t+1 ;
                                   
                  if s2[i] =1 then begin
                  if t>s then
             begin      s:=t; u1:= i-1;   end;

                   end;
                         if s2[i] =1 then t:=0;
                     end;
                         u2 := u1-s+1;

                        ///////////  a1 b1 c1
                             for i:=1 to n   do
      begin
        Form1.Caption:=IntToStr(GetTickCount-Tick);
        s3[i]:=   (a1*i*i+ b1*i  + c1)  ;
        if s3[i]<=0 then begin v1:=i; break
       end; end;

        for j:= 1 to N do  begin
          Form1.Caption:=IntToStr(GetTickCount-Tick);
       IF S3[j]> 0 then
             if good (s3[j]) then
              begin
               s4[j]:=1 ; z3:= z3+1; end
        else  begin s4[j]:=0;  z4:= z4+1;
                    end;  end;
                  m1:=0;
                  for i:=1 to n do  begin   //простые   - многгочлен № 2
                  if s4[i]=1 then m1:=m1+1 ;
                  if s4[i] =0 then begin
                  if m1>w1 then
             begin      w1:=m1;      j3:= i-1;end;
                     m1:=0
                   end;
                     end;     
                         j4 := j3-w1+1;
                         //составные   - многочлен № 2
                                for i:=1 to n do  begin
                           if ((s4[i-1] =1) and  (s4[i] =0)) then y2 := i ;
                  if s4[i]=0 then t1:=t1+1 ;
                  if s4[i] =1 then begin
                  if t1>d then
             begin      d:=t1;      u3:= i-1;  t1:=0; end;
                         if s2[i] =0 then t1 :=0;
                   end;
                     end;
                         u4 := u3-d+1;
                   /////////////////////////////   натуральный ряд чисел
        for j:= 1 to N do  begin
             if good (j) then
              begin
               s5[j]:=j ; z5:= z5+1; end
        else  begin s6[j]:=j;  z6:= z6+1;
                    end;  end;
                  m2:=0;
                  // натуральный ряд составные числа
                  for i:=1 to n do  begin
                       if ((s5[i-1] >0) and  (s6[i] >0)) then y3 := i ;
                  if s5[i]=0 then m2:=m2+1 ;
                  if s5[i] >0 then begin
                       Form1.Caption:=IntToStr(GetTickCount-Tick);
                  if m2>w2 then
             begin      w2:=m2;      j5:= i-1;end;
                     m2:=0
                   end;
                     end;
                         j6 := j5-w2+1;
                      // ряд простых числел
                    for j:= 1 to N do
             if good (j) then
              begin
               z7:= z7+1; s7[z7]:=j end   ;
                    // частное простых и всех чисел
                    h1 := z1/n;//    многочлен № 1
                    h2 := z3/n;//  многочлен № 2
                    h3:= z5/n; // ряд натуральных чисел

               for i:= 1 to n do
               n1 := n1 + s1[i];

                 for i:= 1 to n do
               n2 := n2 + s3[i];

                   for i:= 1 to n do

                          begin
              if s5[i]>0 then n3 := n3+s5[i];
              if s6[i]>0 then n3 := n3+s6[i]    ;
                           end;

                     for i:= 1 to n do
               n4 := n4 + s7[i];

               d1 :=n1/n;
                  d2 :=n2/n;
                   d3 :=n3/n;
                    d4 := n4/z7;

                    for i:= j2 to j1 do
                    for j:= j4  to j3 do
                    if  s1[i] = s3[j] then s8[i] :=s1[i] ;   

                   //////////////////////////
            for i:=1 to n  do    begin
   StringGrid2.Cells[i,1]:=
   IntToStr( s1[i]);
                  StringGrid2.Cells[i,2]:=
   IntToStr( s2[i]);
              StringGrid2.Cells[i,4]:=
   IntToStr( s3[i]);
                  StringGrid2.Cells[i,5]:=
   IntToStr( s4[i]);

         if  s5[i]=0 then
               StringGrid2.Cells[i,7]:= '-';
      if  s5[i]>0 then
               StringGrid2.Cells[i,7]:=    IntToStr(i);
                          if  s5[i]>0 then
                  StringGrid2.Cells[i,8]:= '-';
                    if  s5[i]=0 then
                  StringGrid2.Cells[i,8]:=  IntToStr( i);
   IntToStr( s6[i]);
             StringGrid2.Cells[i,10]:=
   IntToStr( s7[i]);
         
  // выоод простых чисел с 41
      if s7[i]>=41 then
     StringGrid2.Cells[i-13,10]:=
  IntToStr( s7[i]);
             end;

             for i:=1 to 50  do
         if i<=w then
   StringGrid2.Cells[i,12]:=
   IntToStr( s8[i])
   else StringGrid2.Cells[i,12]:='-';

          Edit1.Text :=
          'a='+' '+IntToStr(a)+'   '  +
            'b='+' '+IntToStr(b)+'   '  +
        'c='+'  '+IntToStr(c)+'   '  +
          'v='+'  '+IntToStr(v)+'   '  +
             'z1='+'  '+IntToStr(z1)+'   '  +
               'z2='+'  '+IntToStr(z2)+'   '  +
                  'w='+'  '+IntToStr(w)  +'   '  +
                   'm='+'  '+IntToStr(m) +'   '  +
                        'j1='+'  '+IntToStr(j1) +'   '  +
                           'j2='+' '+IntToStr(j2) +'   '  +
                              's='+'  '+IntToStr(s) +'   '  +
                               't='+'  '+IntToStr(t)  +'   '  +
                        'u1='+'  '+IntToStr(u1) +'   '  +
                           'u2='+' '+IntToStr(u2) +'   '  +
                                   'y1='+' '+IntToStr(y1) +'   '  +
                                     's2[n]='+' '+IntToStr(s2[n]) +'   '  +
                             'd1='+' '+  FormatFloat('0.00000',d1)   +'   '  +
                          'h1='+' '+  FormatFloat('0.00000',h1);

                   Edit2.Text :=
                      'a1='+'   '+IntToStr(a1)+'   '  +
            'b1='+' '+IntToStr(b1)+'   '  +
        'c1='+'  '+IntToStr(c1)+'   '  +
           'v1='+'  '+IntToStr(v1)+'   '  +
             'z3='+'  '+IntToStr(z3)+'   '  +
               'z4='+'  '+IntToStr(z4)+'   '  +
                  'w1='+'  '+IntToStr(w1)  +'   '  +
                   'm1='+'  '+IntToStr(m1) +'   '  +
                        'j3='+'  '+IntToStr(j3) +'   '  +
                           'j4='+' '+IntToStr(j4)  +'   '  +
                              'd='+'  '+IntToStr(d) +'   '  +
                             't1='+'  '+IntToStr(t1)  +'   '  +
                        'u3='+'  '+IntToStr(u3) +'   '  +
                           'u4='+' '+IntToStr(u4) +'   '  +
                                 'y2='+' '+IntToStr(y2) +'   '  +
                             's4[n]='+' '+IntToStr(s4[n]) +'   '  +
                             'd2='+' '+  FormatFloat('0.00000',d2)   +'   '  +

                                'h2='+' '+ FormatFloat('0.00000',h2);

                       Edit3.Text :=
                        'v2='+'    '+IntToStr(v2)+'   '  +
             'z5='+'    '+IntToStr(z5)+'   '  +
               'z6='+'    '+IntToStr(z6)+'   '  +
                  'w2='+'    '+IntToStr(w2)  +'   '  +
                   'm2='+'    '+IntToStr(m2) +'   '  +
                        'j5='+'    '+IntToStr(j5) +'   '  +
                           'j6='+'   '+IntToStr(j6) +'   '  +
                                'y3='+'   '+IntToStr(y3) +'   '  +
                                   's5[n]='+' '+IntToStr(s5[n]) +'   '  +
                             'd3='+' '+  FormatFloat('0.00000',d3)   +'   '  +
                              'h3='+'   '+  FormatFloat('0.00000',h3);

                         Edit4.Text :=
                              'n4='+'   '+IntToStr(n4) +'   '  +
                            'z7='+'   '+IntToStr(z7) +'   '  +
                          'd4='+' '+  FormatFloat('0.00000',d4);

                         end;

  /////////  ///////////////////////////////////////////////////////

        procedure TForm1.Button5Click(Sender: TObject);
begin
      close
end;
         initialization
randomize;
end.

Отредактировано Борис (2022-09-13 00:29:43)