ПРОГРАММА «xАлгебраический многочлен»

ОГЛАВЛЕНИЕ

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

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

1. Общее
Программа «xАлгебраический многочлен» разработана в развитие программы «+-Алгебраический многочлен».
К операциям:
Генерирование многочлена
Приведение подобных членов
Расстановка одночленов по убыванию степени переменных

Добавлены:
Генерация цепочки многочленов
Перемножение многочленов

Моё мнение.
Курс информатики в школе должен быть пересмотрен.
Необходимо.
1. Школьник должен освоить язык программирования.
Разный по школам.
Самый простой Дельфи 7.
Остальное не важно.
2. Программирование должно быть на основе школьных предметов.
Знаний программирования для освоения в объеме решения задач школьной программы нужно немного.
Михаил Фленов
БИБЛИЯ  DELPHI
676 стр.
Для решения многих задач по школьной программы достаточно изучить 40 стр.
Программирование, как плавание. Одни люди плавают, другие нет.
Можно плавать по-собачьи, можно баттерфляем.
Алгебра в школе – много об операциях с алгебраическими многочленами.
О многочленах
https://math-prosto.ru/ru/pages/polynom … olynomial/

2. Исходные данные
a=10 ; //Число исходных многочленов
      b= 2  ;// максимальное число одночленов многочлена
       c=30; //задание вероятности не равного нулю одночлена многочлена
       c1=45;// задание вероятности  не равного нулю одночлена многочлена
        d=10;// задание степени переменой одночлена
          f= 4; //задание  коэффициента одночлена
           e1=9; //   знак степени  переменных
          e2=13;//   знак степени  переменных
          e3= 4;//  знак коэффициента
          e4= 15;//   знак коэффициента
          hh=1500; //размер массивов
          yy= 10000;//служебное число. В сумме со степенями неизвестных =
         // положительное число

3. Структура программы
2.1. Массивы
      w:   array [1..2,1..a*b] of  integer;//члены алгебраических многочленов
  //1-степени переменных   2-коффициенты
p : array [1..hh] of integer;//нумерация одночленов
   p1 :array [1..hh] of integer;// номер одночлена в многочлене
p2 :array [1..hh] of integer;//  номера одночленов по номеру многочлена
p3:array [1..hh] of  integer;// сумма одночленов для каждого многочлена
p4:   array [1..hh] of  integer;// все коэффициенты в многочлене равны 0
//номер последнего одночлена
   p5:   array [1..hh] of  integer;// все коэффициенты в многочлене равны 0
   //по номерам многочленов
u: array [1..2,1..hh] of  integer;//текущий многочлен
u1:  array [1..2,1..hh] of  integer;//произведение текущего многочлена и
// очередного многочлена  = новый текущий многочлен
u2: array [1..2,1..hh] of  integer;//приведение подобных одночленов
// в текущем многочлене
u3: array [1..2,1..hh] of  integer;//к степеням неизвестных добавляется  yy
   u4: array [1..2,1..hh] of  integer;//упорядочение степеней
  //по убыванию степени
  yb: array [1..a] of  integer;//последовательное сложение размеров многочленов
  //размер многочлена - числу одночленов в многочлене
  y: array [1..2,1..hh] of  integer;//первый текущий многочлен
   v1:array [1..hh] of  integer;//пошаговая сумма элементов массива u
   //не равных нулю
   v2: array [1..hh] of  integer;// пошаговая сумма элементов массива u1
   //не равных нулю
v3:array [1..hh] of  integer;//  пошаговая сумма элементов массива u2
   //не равных нулю
v4:array [1..hh] of  integer;// пошаговая сумма элементов массива u3
   //не равных нулю
v5:array [1..hh] of  integer;//  пошаговая сумма элементов массива u4
   //не равных нулю
2. 2. Блоки
Программа делится на два блока.
Блок 1
Генерируется последовательность из a многочленов.
В каждом многочлене не более b одночленов.
Возможен вариант. Все одночлены в многочлене равны нулю.
Блок 2
Производится перемножение многочленов.
Текущий многочлен умножается последовательно на все многочлены,
начиная с многочлена №2.
Начально текущий многочлен равен многочлену №1.
После каждого перемножения текущий многочлен:
Операция 1
Приведение подобных одночленов.
Операция 2
Упорядочение степеней
  по убыванию степени
Операция 3
Обновление текущего многочлена и
продолжение перемножения многочленов

4. Алгоритм
Блок 1
Действие 1

Формируется последовательность многочленов по исходным данным.
w:   array [1..2,1..a*b] of  integer
Действие 2
Масcив w копируется в массив  u.
  Действие  3
Формируется исходный  текущий многочлен
y: array [1..2,1..hh] of  integer;//
Первый многочлен текущий.
Блок 2
Действие 1

Текущий многочлен умножается на второй многочлен.
Находится произведение – массив u1.
Действие 2
Приводятся подобные члены
Массив u2
Действие 3
К степеням неизвестных прибавляется yy
Массив u3
Действие 4
Элементы массива u3 расставляются по убыванию степени переменных.
Вычитание из степеней yy.
Массив u4.
Действие 5
Массив u4 копируется в массив u.
u текущий многочлен.
Действие 6
Действия 2 -5 повторяются, пока не будут перемножены все многочлены.
Разметка многочленов – массив yb.

5. Вывод
Выводятся основные массивы.
k – число одночленов с коэффициентами больше нуля.
k1- число одночленов с коэффициентами равными нулю.
f1 - сумма многочленов, у которых все одночлены равны нулю
u4 – результат перемножения многочленов

6. Скачать программу

https://disk.yandex.ru/d/gu3Q1-MfmnLVPw

Приложение 1

Распечатка программы 

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button5: TButton;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    StringGrid3: TStringGrid;
    Edit1: TEdit;
    Label4: TLabel;
    StringGrid1: TStringGrid;
    StringGrid4: TStringGrid;
    Edit2: TEdit;
    PaintBox1: TPaintBox;

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

  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
          const
    a=10 ; //Число исходных многочленов
      b= 2  ;// максимальное число одночленов многочлена
       c=30; //задание вероятности не равного нулю одночлена многочлена
       c1=45;// задание вероятности  не равного нулю одночлена многочлена
        d=10;// задание степени переменой одночлена
          f= 4; //задание  коэффициента одночлена
           e1=9; //   знак степени  переменных
          e2=13;//   знак степени  переменных
          e3= 4;//  знак коэффициента
          e4= 15;//   знак коэффициента
          hh=1500; //размер массивов
          yy= 10000;//служебное число. В сумме со степенями неизвестных =
         // положительное число

      var
       Tick: Cardinal;

     w:   array [1..2,1..a*b] of  integer;//члены алгебраических многочленов
  //1-степени переменных   2-коффициенты
p : array [1..hh] of integer;//нумерация одночленов
   p1 :array [1..hh] of integer;// номер одночлена в многочлене
p2 :array [1..hh] of integer;//  номера одночленов по номеру многочлена
p3:array [1..hh] of  integer;// сумма одночленов для каждого многочлена
p4:   array [1..hh] of  integer;// все коэффициенты в многочлене равны 0
//номер последнего одночлена
   p5:   array [1..hh] of  integer;// все коэффициенты в многочлене равны 0
   //по номерам многочленов
u: array [1..2,1..hh] of  integer;//текущий многочлен
u1:  array [1..2,1..hh] of  integer;//произведение текущего многочлена и
// очередного многочлена  = новый текущий многочлен
u2: array [1..2,1..hh] of  integer;//приведение подобных одночленов
// в текущем многочлене
u3: array [1..2,1..hh] of  integer;//к степеням неизвестных добавляется  yy
   u4: array [1..2,1..hh] of  integer;//упорядочение степеней
  //по убыванию степени
  yb: array [1..a] of  integer;//последовательное сложение размеров многочленов
  //размер многочлена - числу одночленов в многочлене
  y: array [1..2,1..hh] of  integer;//первый текущий многочлен
   v1:array [1..hh] of  integer;//пошаговая сумма элементов массива u
   //не равных нулю
   v2: array [1..hh] of  integer;// пошаговая сумма элементов массива u1
   //не равных нулю
v3:array [1..hh] of  integer;//  пошаговая сумма элементов массива u2
   //не равных нулю
v4:array [1..hh] of  integer;// пошаговая сумма элементов массива u3
   //не равных нулю
v5:array [1..hh] of  integer;//  пошаговая сумма элементов массива u4
   //не равных нулю

tt,i,j,q ,z,r,i1,i2,i3,i4,i5,i6,i7,j1,j2,j3,j4,j5,j6,j7, g , v:  integer;
t,  n1, n2, n3,n4,ia,ib,ic,ih,ii,it,iz,ix,im,iv,iu, r1,rr   : integer;//
   m1,m2,m3,m4,m5,k,k1,k2,k3,pa,aa,x, bb : integer;//
  f1,f2,f3,f4,f5,z2,z4,z6,z8,z9,  gg: integer;//
z1,z3,z5,z7 : integer;
  // n: variant;

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

for q:= 1 to 100   // нумерация по вертикали  в табл №2 ,
     do StringGrid2.Cells[0,q]:=IntToStr(q);
    for q:=1 to 1000 //нумерация по горизонтали в табл №2 ,
     do  StringGrid2.Cells[q,0]:=IntToStr(q);

             for q:= 1 to 10   // нумерация по вертикали  в табл №1 ,
     do       StringGrid3.Cells[0,q]:=IntToStr(q);
    for q:=1 to 500//нумерация по горизонтали в табл №1 ,
     do    StringGrid3.Cells[q,0]:=IntToStr(q);
         ///////////////////////////////////\
         ///////////////////////////////////

               StringGrid1.Cells[0,0] := '№1';
                     StringGrid2.Cells[0,0] := '№2';
                   StringGrid3.Cells[0,0] := '№3';

          StringGrid1.Cells[0,1] := 'W[1..]';
            StringGrid1.Cells[0,2] := 'W[2..]';
                   StringGrid1.Cells[0,3] := 'P[..]';
                      StringGrid1.Cells[0,4] := 'P1[..]';
                            StringGrid1.Cells[0,5] := 'P2[..]';
                 StringGrid1.Cells[0,6] := 'P3[1..]';
                     StringGrid1.Cells[0,7] := 'P4[1..]';
                         StringGrid1.Cells[0,8] := 'P5[1..]';
                       StringGrid1.Cells[0,9] := 'yb[1..]';
                 StringGrid1.Cells[0,10] := 'Y[1..]';
                    StringGrid1.Cells[0,11] := 'Y[2..]';

               StringGrid2.Cells[0,1] := 'U[1,..]';
                 StringGrid2.Cells[0,2] := 'U[2,..]';
                    StringGrid2.Cells[0,4] := 'U1[1,..]';
                 StringGrid2.Cells[0,5] := 'U[2,..]';
               StringGrid2.Cells[0,7] := 'U2[1,..]';
                 StringGrid2.Cells[0,8] := 'U2[2,..]';
                    StringGrid2.Cells[0,10] := 'U3[1,..]';
                 StringGrid2.Cells[0,11] := 'U3[2,..]';
                   StringGrid2.Cells[0,13] := 'U4[1,..]';
                 StringGrid2.Cells[0,14] := 'U4[2,..]';

                   StringGrid3.Cells[0,1] := 'V1[1, ]';
                    StringGrid3.Cells[0,2] := 'V2[1, ]';
                     StringGrid3.Cells[0,3] := 'V3[1, ]';
                    StringGrid3.Cells[0,4] := 'V4[1, ]';
                      StringGrid3.Cells[0,5] := 'V5[1, ]';
     //////////////////////////
     ///////////////////////////
                  t:=1;  K:=0; k1:=  0;  k2:=0;
                       For i5:=1  to  a   do
                        begin
                     k2:=0;
                         for i:=1 to b  do
             if ( (random (c) +1) <c1) then
             begin
                   k:=k+1;
               p[k] :=k;
               p1[k] :=i;
               p2[k] :=i5;
                   if e1<random (e2) then
                   w[1,k]:= random(d)
                    else w[1,k] := -random(d);
               if e3<random (e4) then
                   w[2,k]:= random(f) +1
                    else w[2,k] := -random(f) -1  ;
                    end
             else begin k1:=k1+1; k2:=k2+1;end;
             if k2 =b  then
                 begin
                 f1:= f1+1;
                  p4[f1] := i5;
                  p5[f1] := i;
                 end;
            end;
             //////////////////////////////////////////////////
           for i7:=1  to hh do
          if  p2[i7]>0 then
          p3[p2[i7]]:= p3[p2[i7]] +1;

          for i6:=1 to hh do
           if   p3[i6]> 0 then
                aa:=aa+1;

                    yb[1]:=p3[1];
               for ib := 2 to a do
              yb[ib]:=yb[ib-1] +p3[ib] ;

                             // перемножение многочленов
                        for i:=1 to yb[1] do
                        begin
                          u[1,i] := w[1,i];
                          u[2,i] := w[2,i];
                        end;
                            pa := p3[1];
                             r1:=0;
                      for iu:=1  to hh do
                      begin
                         y[1,iu] := u[1,iu];
                                y[2,iu] := u[2,iu];
                                 end;

                         rr := 0;
                       for ic:=1 to a-1 do
                          begin
                       for it :=1 to hh    do
                       begin
                         u1[1,it] :=0;
                         u1[2,it] :=0;
                       end;
              begin
                     rr:=0;
                     for i:=1 to pa do
                     for j:= yb[ic]+1 to yb[ic+1]  do
                          begin
                    rr:=rr+1;
                  u1[1,rr] := u[1,i]+w[1,j];
                  u1[2,rr] := u[2,i]*w[2,j];
                     end;

                        //////////////////////////////////
                        /////////////////////////
           for i:=1  to hh do //приведение подобных одночленов
        for j:= 1 to hh  do
        begin
         u2[1,j] := u1[1,j];
            u2[2,j] := u1[2,j];
        end;

                   for z:=1 to hh do
                    for i2:=z+1 to hh do
            if u2[1,z] = u2[1,i2] then   begin
              Form1.Caption:=IntToStr(GetTickCount-Tick);
             v:=i2; x:=x+1;
             u2[2,z]:= u2[2,z]+u2[2,i2];
               u2[1,i2] :=0;
               u2[2,i2] :=0;
                     end;

                      //Растановка одночленов по величине
                                          // степени переменной
                    for i:=1 to 2 do
                    for j:=1 to hh do begin
                    u3[1,j]  := u2[1,j]+yy;
                         u3[2,j]  := u2[2,j];
                        end;

         for tt:=1 to hh do
            for i3 := 2 to hh  do
                       begin
                          Form1.Caption:=IntToStr(GetTickCount-Tick);
                       begin
                    n1:=   u3[1,i3-1] ;
                      n2 :=  u3[2,i3-1] ;
                     n3 :=    u3[1,i3];
                      n4 := u3[2,i3] ;
                      end;
                if (n1>0) and ((n3>=0)and (n4<>0))then
                       if  n1< n3  then
                        begin
               u3[1,(i3-1)]  :=n3;
                         u3[2,i3-1]:=n4;
                            u3[1,(i3)] :=n1 ;
                               u3[2,i3] :=n2;
                   end;
                 if  (n2=0) and (n4<>0) then
                        begin
                u3[1,(i3-1)]  :=n3;
                          u3[2,i3-1]:=n4;
                             u3[1,(i3)] :=n1 ;
                                u3[2,i3] :=n2;
                                     end;
                                end;
                for j4:=1 to hh do  begin
                       u4[1,j4]:=u3[1,j4] -yy;
                       u4[2,j4] := u3[2,j4];
                         if u3[2,j2] = 0 then u4[1,j4] :=0;
                          end;
                          pa:=0;
           for ih :=1 to hh do
           if u4[2,ih] <>0 then pa := pa +1;
                             end;

        for ii:= 1 to hh  do
         begin
         u[1,ii] := u4[1,ii];
          u[2,ii] := u4[2,ii];
         end;
                 for iz:=1 to hh do
                                        begin
                       if u[2,iz]<>0 then  v1[ic] :=v1[ic]+1;
         if u1[2,iz]<>0 then  v2[ic] :=v2[ic]+1;
          if u2[2,iz]<>0 then  v3[ic] :=v3[ic]+1;
            if u3[2,iz]<>0 then  v4[ic] :=v4[ic]+1;
                 if u4[2,iz]<>0 then  v5[ic] :=v5[ic]+1;
                                              end;
                              end;
                         ////////////////////////////////////////
     ///////////////////////////////////////////////////////////////////////////
           //////////////////////////////////////////////////////////////////
                  for i:=1 to 2 do
                for j:=1 to  a*b do
                    StringGrid1.Cells[j,i] := IntToStr(w[i,j]);

                for i:=1 to  hh do
                                begin
                    StringGrid1.Cells[i,10] := IntToStr(y[1,i]);
                     StringGrid1.Cells[i,11] := IntToStr(y[2,i]);
                              end;

                  for i:=1 to hh do begin
                     StringGrid1.Cells[i,3] := IntToStr(p[i]);
                      StringGrid1.Cells[i,4] := IntToStr(p1[i]);
                          StringGrid1.Cells[i,5] := IntToStr(p2[i]);
                          StringGrid1.Cells[i,6] := IntToStr(p3[i]);
                         StringGrid1.Cells[i,7] := IntToStr(p4[i]);
                             StringGrid1.Cells[i,8] := IntToStr(p5[i]);
                                                    end;

                      for i:=1 to a do
                       StringGrid1.Cells[i,9] := IntToStr(yb[i]);

                                        for j:=1 to  hh do begin
                    StringGrid2.Cells[j,1] := IntToStr(u[1,j]);
                    StringGrid2.Cells[j,2] := IntToStr(u[2,j]);
                       StringGrid2.Cells[j,4] := IntToStr(u1[1,j]);
                    StringGrid2.Cells[j,5] := IntToStr(u1[2,j]);
                        StringGrid2.Cells[j,7] := IntToStr(u2[1,j]);
                        StringGrid2.Cells[j,8] := IntToStr(u2[2,j]);
                        StringGrid2.Cells[j,10] := IntToStr(u3[1,j]);
                        StringGrid2.Cells[j,11] := IntToStr(u3[2,j]);
                     StringGrid2.Cells[j,13] := IntToStr(u4[1,j]);
                        StringGrid2.Cells[j,14] := IntToStr(u4[2,j]);
                    end;

                           for j:=1 to hh do begin
                    StringGrid3.Cells[j,1] := IntToStr(v1[j]);
                    StringGrid3.Cells[j,2] := IntToStr(v2[j]);
                       StringGrid3.Cells[j,3] := IntToStr(v3[j]);
                              StringGrid3.Cells[j,4] := IntToStr(v4[j]);
                           StringGrid3.Cells[j,5] := IntToStr(v5[j]);
                              end;
                    Edit1.Text :=
        'k=' +'  '+ IntToStr(k)
           +'  '+ 'k1=' +'  '+ IntToStr(k1)
              +'  '+ 'k2=' +'  '+ IntToStr(k2)
             +'  '+ 'p[2]=' +'  '+ IntToStr(p[2])
               +'  '+ 't=' +'  '+  FormatFloat('0.00',t)
                 +'  '+ 'x=' +'  '+ IntToStr(x)
                //  +'  '+ 'y[2]=' +'  '+ IntToStr(y[2])
                      +'  '+ 'n1=' +'  '+ IntToStr(n1)
                  +'  '+ 'n2=' +'  '+ IntToStr(n2)
                       +'  '+ 'n3=' +'  '+ IntToStr(n3)
                  +'  '+ 'n4=' +'  '+ IntToStr(n4)
                     +'  '+ 'n4=' +'  '+ IntToStr(n4)
                      +'  '+ 'k1=' +'  '+ IntToStr(k1)
                         +'  '+ 'rr=' +'  '+ IntToStr(rr)
                      +'  '+ 'r1=' +'  '+ IntToStr(r1)  ;

                         Edit2.Text :=
        'pa=' +'  '+ IntToStr(pa)
                    +'  '+ 'rr=' +'  '+ IntToStr(rr)
                    +'  '+ 'aa=' +'  '+ IntToStr(aa)
                      +'  '+ 'bb=' +'  '+ IntToStr(bb)
                       +'  '+ 'f1=' +'  '+ IntToStr(f1);
                                end;
  /////////  ///////////////////////////////////////////////////////
        procedure TForm1.Button5Click(Sender: TObject);
begin
      close
end;
         initialization
randomize;
end.