tupper_s_self-referential_formula.pl 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. #!/usr/bin/perl
  2. # Tupper's self-referential formula.
  3. # Plot the inequality:
  4. # 1/2 < floor(mod(floor(y/17)*2^(-17*floor(x)-mod(floor(y), 17)),2))
  5. # See also:
  6. # https://www.youtube.com/watch?v=_s5RFgd59ao
  7. # https://en.wikipedia.org/wiki/Tupper's_self-referential_formula
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use Imager;
  12. use Math::AnyNum qw(PREC 2048 :overload floor mod);
  13. my $red = Imager::Color->new('#ff0000');
  14. my $img = Imager->new(xsize => 111,
  15. ysize => 17);
  16. my $k = Math::AnyNum->new('960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719');
  17. foreach my $x (0 .. 110) {
  18. foreach my $y (0 .. 16) {
  19. if (1/2 < floor(mod(exp(log(floor(($y + $k) / 17)) + log(2) * (-17 * $x - mod($y + $k, 17))), 2))) {
  20. $img->setpixel(x => '110' - $x - '2', y => $y, color => $red);
  21. }
  22. }
  23. }
  24. $img->write(file => 'tupper_formula.png');