ПРОГРАММА «Простые 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)