Created
March 25, 2017 15:23
-
-
Save jmsfwk/a6d9d167404888a56a07f776ca88098a to your computer and use it in GitHub Desktop.
A couple of algoritms for calculating the date of Easter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| class Computus | |
| { | |
| public static function gauss(int $year) | |
| { | |
| $a = $year % 19; | |
| $b = $year % 4; | |
| $c = $year % 7; | |
| $k = floor($year / 100); | |
| $p = floor((13 + 8 * $k) / 25); | |
| $q = floor($k / 4); | |
| $M = (15 - $p + $k - $q) % 30; | |
| $N = (4 + $k - $q) % 7; | |
| $d = (19 * $a + $M) % 30; | |
| $e = (2 * $b + 4 * $c + 6 * $d + $N) % 7; | |
| $day = 22 + $d + $e; | |
| $month = '03'; | |
| if ($day > 31) { | |
| $day = $d + $e - 9; | |
| $month = '04'; | |
| } | |
| if ($d === 29 && $e === 6) { | |
| $day = 19; | |
| } | |
| if ($d === 28 && $e === 6 && (11 * $M + 11) % 30 < 19) { | |
| $day = 18; | |
| } | |
| return sprintf('%s-%s-%02d', $year, $month, $day); | |
| } | |
| public static function anonymous(int $year) | |
| { | |
| $a = $year % 19; | |
| $b = floor($year / 100); | |
| $c = $year % 100; | |
| $d = floor($b / 4); | |
| $e = $b % 4; | |
| $f = floor(($b + 8) / 25); | |
| $g = floor(($b - $f + 1) / 3); | |
| $h = (19 * $a + $b - $d - $g + 15) % 30; | |
| $i = floor($c / 4); | |
| $k = $c % 4; | |
| $l = (32 + 2 * $e + 2 * $i - $h - $k) % 7; | |
| $m = floor(($a + 11 * $h + 22 * $l) / 451); | |
| $month = floor(($h + $l - 7 * $m + 114) / 31); | |
| $day = (($h + $l - 7 * $m + 114) % 31) + 1; | |
| return sprintf('%s-%02s-%02d', $year, $month, $day); | |
| } | |
| /** | |
| * @param int $year | |
| * | |
| * @see https://web.archive.org/web/20150227133210/http://www.merlyn.demon.co.uk/estralgs.txt | |
| * @return string | |
| */ | |
| public static function petrofsky(int $year) | |
| { | |
| $a = $year / 100 | 0; | |
| $b = $a / 4 | 0; | |
| $c = ($a + 1258) * 2267; | |
| $d = $year % 19; | |
| $e = (19 * $d + (($c / 25 | 0) - $b)) % 30; | |
| $f = $e - ((($e * 11 + $d) / 319) | 0); | |
| $g = 120 + $f - ($f + $year + (($year / 4) | 0) + $b + $c) % 7; | |
| $month = $g / 31 | 0; | |
| $day = $g % 31 + 1; | |
| return sprintf('%s-%02s-%02d', $year, $month, $day); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| use PHPUnit\Framework\TestCase; | |
| class ComputusTest extends TestCase | |
| { | |
| /** | |
| * @test | |
| * @dataProvider easter | |
| */ | |
| public function gauss($date) | |
| { | |
| $year = explode('-', $date)[0]; | |
| $this->assertEquals($date, Computus::gauss($year)); | |
| } | |
| /** | |
| * @test | |
| * @dataProvider easter | |
| */ | |
| public function anonymous($date) | |
| { | |
| $year = explode('-', $date)[0]; | |
| $this->assertEquals($date, Computus::anonymous($year)); | |
| } | |
| /** | |
| * @test | |
| * @dataProvider easter | |
| */ | |
| public function petrofsky($date) | |
| { | |
| $year = explode('-', $date)[0]; | |
| $this->assertEquals($date, Computus::petrofsky($year)); | |
| } | |
| public function easter() | |
| { | |
| return [ | |
| ["1800-04-13"], | |
| ["1801-04-05"], | |
| ["1802-04-18"], | |
| ["1803-04-10"], | |
| ["1804-04-01"], | |
| ["1805-04-14"], | |
| ["1806-04-06"], | |
| ["1807-03-29"], | |
| ["1808-04-17"], | |
| ["1809-04-02"], | |
| ["1810-04-22"], | |
| ["1811-04-14"], | |
| ["1812-03-29"], | |
| ["1813-04-18"], | |
| ["1814-04-10"], | |
| ["1815-03-26"], | |
| ["1816-04-14"], | |
| ["1817-04-06"], | |
| ["1818-03-22"], | |
| ["1819-04-11"], | |
| ["1820-04-02"], | |
| ["1821-04-22"], | |
| ["1822-04-07"], | |
| ["1823-03-30"], | |
| ["1824-04-18"], | |
| ["1825-04-03"], | |
| ["1826-03-26"], | |
| ["1827-04-15"], | |
| ["1828-04-06"], | |
| ["1829-04-19"], | |
| ["1830-04-11"], | |
| ["1831-04-03"], | |
| ["1832-04-22"], | |
| ["1833-04-07"], | |
| ["1834-03-30"], | |
| ["1835-04-19"], | |
| ["1836-04-03"], | |
| ["1837-03-26"], | |
| ["1838-04-15"], | |
| ["1839-03-31"], | |
| ["1840-04-19"], | |
| ["1841-04-11"], | |
| ["1842-03-27"], | |
| ["1843-04-16"], | |
| ["1844-04-07"], | |
| ["1845-03-23"], | |
| ["1846-04-12"], | |
| ["1847-04-04"], | |
| ["1848-04-23"], | |
| ["1849-04-08"], | |
| ["1850-03-31"], | |
| ["1851-04-20"], | |
| ["1852-04-11"], | |
| ["1853-03-27"], | |
| ["1854-04-16"], | |
| ["1855-04-08"], | |
| ["1856-03-23"], | |
| ["1857-04-12"], | |
| ["1858-04-04"], | |
| ["1859-04-24"], | |
| ["1860-04-08"], | |
| ["1861-03-31"], | |
| ["1862-04-20"], | |
| ["1863-04-05"], | |
| ["1864-03-27"], | |
| ["1865-04-16"], | |
| ["1866-04-01"], | |
| ["1867-04-21"], | |
| ["1868-04-12"], | |
| ["1869-03-28"], | |
| ["1870-04-17"], | |
| ["1871-04-09"], | |
| ["1872-03-31"], | |
| ["1873-04-13"], | |
| ["1874-04-05"], | |
| ["1875-03-28"], | |
| ["1876-04-16"], | |
| ["1877-04-01"], | |
| ["1878-04-21"], | |
| ["1879-04-13"], | |
| ["1880-03-28"], | |
| ["1881-04-17"], | |
| ["1882-04-09"], | |
| ["1883-03-25"], | |
| ["1884-04-13"], | |
| ["1885-04-05"], | |
| ["1886-04-25"], | |
| ["1887-04-10"], | |
| ["1888-04-01"], | |
| ["1889-04-21"], | |
| ["1890-04-06"], | |
| ["1891-03-29"], | |
| ["1892-04-17"], | |
| ["1893-04-02"], | |
| ["1894-03-25"], | |
| ["1895-04-14"], | |
| ["1896-04-05"], | |
| ["1897-04-18"], | |
| ["1898-04-10"], | |
| ["1899-04-02"], | |
| ["1900-04-15"], | |
| ["1901-04-07"], | |
| ["1902-03-30"], | |
| ["1903-04-12"], | |
| ["1904-04-03"], | |
| ["1905-04-23"], | |
| ["1906-04-15"], | |
| ["1907-03-31"], | |
| ["1908-04-19"], | |
| ["1909-04-11"], | |
| ["1910-03-27"], | |
| ["1911-04-16"], | |
| ["1912-04-07"], | |
| ["1913-03-23"], | |
| ["1914-04-12"], | |
| ["1915-04-04"], | |
| ["1916-04-23"], | |
| ["1917-04-08"], | |
| ["1918-03-31"], | |
| ["1919-04-20"], | |
| ["1920-04-04"], | |
| ["1921-03-27"], | |
| ["1922-04-16"], | |
| ["1923-04-01"], | |
| ["1924-04-20"], | |
| ["1925-04-12"], | |
| ["1926-04-04"], | |
| ["1927-04-17"], | |
| ["1928-04-08"], | |
| ["1929-03-31"], | |
| ["1930-04-20"], | |
| ["1931-04-05"], | |
| ["1932-03-27"], | |
| ["1933-04-16"], | |
| ["1934-04-01"], | |
| ["1935-04-21"], | |
| ["1936-04-12"], | |
| ["1937-03-28"], | |
| ["1938-04-17"], | |
| ["1939-04-09"], | |
| ["1940-03-24"], | |
| ["1941-04-13"], | |
| ["1942-04-05"], | |
| ["1943-04-25"], | |
| ["1944-04-09"], | |
| ["1945-04-01"], | |
| ["1946-04-21"], | |
| ["1947-04-06"], | |
| ["1948-03-28"], | |
| ["1949-04-17"], | |
| ["1950-04-09"], | |
| ["1951-03-25"], | |
| ["1952-04-13"], | |
| ["1953-04-05"], | |
| ["1954-04-18"], | |
| ["1955-04-10"], | |
| ["1956-04-01"], | |
| ["1957-04-21"], | |
| ["1958-04-06"], | |
| ["1959-03-29"], | |
| ["1960-04-17"], | |
| ["1961-04-02"], | |
| ["1962-04-22"], | |
| ["1963-04-14"], | |
| ["1964-03-29"], | |
| ["1965-04-18"], | |
| ["1966-04-10"], | |
| ["1967-03-26"], | |
| ["1968-04-14"], | |
| ["1969-04-06"], | |
| ["1970-03-29"], | |
| ["1971-04-11"], | |
| ["1972-04-02"], | |
| ["1973-04-22"], | |
| ["1974-04-14"], | |
| ["1975-03-30"], | |
| ["1976-04-18"], | |
| ["1977-04-10"], | |
| ["1978-03-26"], | |
| ["1979-04-15"], | |
| ["1980-04-06"], | |
| ["1981-04-19"], | |
| ["1982-04-11"], | |
| ["1983-04-03"], | |
| ["1984-04-22"], | |
| ["1985-04-07"], | |
| ["1986-03-30"], | |
| ["1987-04-19"], | |
| ["1988-04-03"], | |
| ["1989-03-26"], | |
| ["1990-04-15"], | |
| ["1991-03-31"], | |
| ["1992-04-19"], | |
| ["1993-04-11"], | |
| ["1994-04-03"], | |
| ["1995-04-16"], | |
| ["1996-04-07"], | |
| ["1997-03-30"], | |
| ["1998-04-12"], | |
| ["1999-04-04"], | |
| ["2000-04-23"], | |
| ["2001-04-15"], | |
| ["2002-03-31"], | |
| ["2003-04-20"], | |
| ["2004-04-11"], | |
| ["2005-03-27"], | |
| ["2006-04-16"], | |
| ["2007-04-08"], | |
| ["2008-03-23"], | |
| ["2009-04-12"], | |
| ["2010-04-04"], | |
| ["2011-04-24"], | |
| ["2012-04-08"], | |
| ["2013-03-31"], | |
| ["2014-04-20"], | |
| ["2015-04-05"], | |
| ["2016-03-27"], | |
| ["2017-04-16"], | |
| ["2018-04-01"], | |
| ["2019-04-21"], | |
| ["2020-04-12"], | |
| ["2021-04-04"], | |
| ["2022-04-17"], | |
| ["2023-04-09"], | |
| ["2024-03-31"], | |
| ]; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment