Саморефернетная формула Таппера
Оценка 4.7

Саморефернетная формула Таппера

Оценка 4.7
Занимательные материалы
docx
информатика +1
9 кл—11 кл
15.05.2023
Саморефернетная формула Таппера
Уникальная формула была выведена Джеффером Таппером в 2011 году и представлена им в докладе на ежегодной конференции SIGGRAPH (Special Interest Group on Computer GRAPHics and Interactive Techniques) в качестве примера о надежности двумерного компьютерного алгоритма построения графиков
Саморефеентная формула таппера.docx

Саморефернетная формула Таппера

Уникальная формула была выведена Джеффером Таппером в 2011 году и  представлена им в докладе на ежегодной конференции SIGGRAPH (Special Interest Group on Computer GRAPHics and Interactive Techniques) в качестве примера о надежности двумерного компьютерного алгоритма построения графиков. В этой статье обсуждаются методы, связанные с графической программой GrafEq, разработанной Таппером.

Формула представляет из себя неравенство, определяемое как:

где - это функция, возвращающая наибольшее целое число, не превосходящее данное, иными слова это «округление вниз», а mod — это оператор остатка от деления, для вещественных чисел остаток от деления, вообще говоря, может быть дробным числом: mod (5,5; 2) = 1,5.

Если мы имеем координатные оси x и y, то и для каждой точки координатной плоскости мы подставляем координаты x и y в неравенство представленное выше. По формуле станет ясно необходимо ли окрашивать эту точку т.е. фактически неравенство говорит, какая часть плоскости должна быть окрашена. В итоге получим:

 

Рисунок 1. Графическое представление работы формулы Таппера

 

Поразительно то, что график формулы является самой формулой. График – это формула, формула – это график. Она называется самореферентной формулой Таппера. Это означает, что при отображении на плоскости, получаем собственное изображение.

Формула действительно удивительная, но в ней есть небольшой секрет. Он заключается в переменной k, находящейся на вертикальной оси y. Секрет в том, что k равно следующему 543-значному целому числу:

 

960 939 379 918 958 884 971 672 962 127 852 754 715 004 339 660 129 306 651 505 519 271 702 802 395 266 424 689 642 842 174 350 718 121 267 153 782 770 623 355 993 237 280 874 144 307 891 325 963 941 337 723 487 857 735 749 823 926 629 715 517 173 716 995 165 232 890 538 221 612 403 238 855 866 184 013 235 585 136 048 828 693 337 902 491 454 229 288 667 081 096 184 496 091 705 183 454 067 827 731 551 705 405 381 627 380 967 602 565 625 016 981 482 083 418 783 163 849 115 590 225 610 003 652 351 370 343 874 461 848 378 737 238 198 224 849 863 465 033 159 410 054 974 700 593 138 339 226 497 249 461 751 545 728 366 702 369 745 461 014 655 997 933 798 537 483 143 786 841 806 593 422 227 898 388 722 980 000 748 404 719

И график мы можем наблюдать очень высоко по y, в небольшой области от k до k + 17. С горизонтальной осью всё проще: график находится в отрезке от 0 до 106.

Что действительно удивительно в формуле Таппера так это то, что она способна рисовать не только саму себя, но и вообще что угодно. Если пройтись вдоль оси y, то она построит каждый возможный рисунок из черных и белых пикселей размером 106 на 17. Т.е. всё, что только можно вместить в такой формат, есть где-нибудь на графике. Любой рисунок, любая формула, а не только сама формула Таппера могут быть изображены с помощью этой формулы.  

Как работает эта формула. Для начала мы берем картинку в пиксельной форме:

 

Рисунок 2. Пиксельное изображение

 

Начинаем рассматривать изображение с левого нижнего угла. Двигаемся вверх, рассматривая каждый столбец. Если пиксель белый, записываем 0. Если черный, то 1. На изображении первые два столбца полностью белые, их можно пропустить. Начинаем считать с пятого. Первые четыре пикселя белые, затем одиннадцать черных, два белых и т.д. Получаем: 00001111111111100.

 

Рисунок 3

 

Продолжаем рассматривать каждый последующий столбец, не прекращая записывать двоичное число.

 

Рисунок 4

 

000 001 100 011 000 000 000 011 000 110 000 000 111 111 111 111 100 001 111 111 111 111 000 001 100 011 000 000 000 001 100 011 000 000 000 001 100 011 000 000 011 111 111 111 110 000 111 111 111 111 000 001 100 011 000 000 000 001 100 011 000 000 000 001 100 011 000 000 000 000 000 000 000 000 000 000 000 000 000 000 011 111 111 100 000 001 111 111 111 110 000 111 000 000 011 100 001 100 000 000 011 000 011 000 000 000 110 000 110 000 000 001 100 001 100 000 000 011 00…

Затем необходимо получившееся двоичное число перевести в десятичное и умножить на 17. Таким образом мы получим k равное

3691345999756222895910966424583227439305545657810604260951976652213834068411237854548951635268553896716961648743286918245909314204201603325130881658990512811383093228339892959570216696830048341864991144380729054134700631481545333334853147762583040585557427672447912466124146618755419973056957520713525065594865057071893691945668095770974685415703681848575401174613382349931984182573476660961044348326547499308173640510033975623549897348908148366520886023130790981829233614685174205825678522675172765585572313118959271361380352

Для создания графического изображения размером 17х106 и для упрощения перевода его графика в двоичное число нами была написана программа на языке Pascal:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,

  StdCtrls, math;

type

  { TForm1 }

  TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    Image1: TImage;

    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

  private

  public

  end;

 

var

  Form1: TForm1;

  i, j: Integer;

  s: Integer=9;

  t: array[0..105,0..16] of TPoint;

  g: String;

 

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);

begin

  Image1.Canvas.Brush.Color:=clWhite;

  with Image1.Canvas do

  begin

   for i:=0 to 105 do begin

      for j:=0 to 16 do begin

         t[i,j].x:=3+i*s;

         t[i,j].y:=3+j*s;

         Rectangle(t[i,j].x, t[i,j].y, t[i,j].x+s, t[i,j].y+s);

      end;

   end;

  end;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

  g:='';

    for i:=0 to 105 do begin

      for j:=0 to 16 do begin

        if Image1.Canvas.Pixels[3+i*s+round(s/2),3+(16-j)*s+round(s/2)]=clBlack then

         g:=g+'1' else g:=g+'0';

      end;

   end;

    memo1.Clear;

    memo1.Lines.Add('k='+g);

end;

 

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

   if Image1.Canvas.Pixels[x,y]=clWhite then

      begin

        Image1.Canvas.Brush.Color:=clBlack;

        Image1.Canvas.FloodFill(x,y,clWhite,fsSurface);

      end;

end;

end.  

 

Рисунок 5. Пример работы программы

 

Заключение:

В данной статье нами была изучена и продемонстрирована самореферентная формула Таппера, способная продемонстрировать надёжность двумерного компьютерного алгоритма построения графиков. Для ее реализации была написана программа, переводящая графическое изображение в числовую последовательность.

Пожалуйста, не забудьте правильно оформить цитату:
Евдокимова Д.А., Горшенина Ю.С., Андреюк П.А. САМОРЕФЕРЕНТНАЯ ФОРМУЛА ТАППЕРА // Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ: сб. ст. по мат. XLIII междунар. студ. науч.-практ. конф. № 8(43). URL: https://sibac.info/archive/meghdis/8(43).pdf (дата обращения: 10.10.2019)


 

Саморефернетная формула Таппера

Саморефернетная формула Таппера

Поразительно то, что график формулы является самой формулой

Поразительно то, что график формулы является самой формулой

Рисунок 2. Пиксельное изображение

Рисунок 2. Пиксельное изображение

Рисунок 4 000 001 100 011 000 000 000 011 000 110 000 000 111 111 111 111 100 001 111 111 111 111 000…

Рисунок 4 000 001 100 011 000 000 000 011 000 110 000 000 111 111 111 111 100 001 111 111 111 111 000…

Classes, SysUtils, FileUtil, Forms,

Classes, SysUtils, FileUtil, Forms,

R *.lfm} { TForm1 } procedure

R *.lfm} { TForm1 } procedure

Clear; memo1.Lines.Add('k='+g); end; procedure

Clear; memo1.Lines.Add('k='+g); end; procedure

Рисунок 5. Пример работы программы

Рисунок 5. Пример работы программы
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
15.05.2023