%\DayOfWeekexpands to the day of the week ("Sunday", etc.) %\PhaseOfMoonexpands to the phase of the moon % %Written by Martin Minow of DEC (minow%bolt.dec@decwrl.dec.com). % \newcount\dow % Gets day of the week \newcount\leap % Leap year fingaler \newcount\x % Temp register \newcount\y % Another temp register \def\DayOfWeek\% % % Calculate day of the week, return "Sunday", etc. % % \newcount\dow % Gets day of the week % \newcount\leap % Leap year fingaler % \newcount\x % Temp register % \newcount\y % Another temp register %leap = year + (month - 14)/12; \leap=\month \advance\leap by -14 \divide\leap by 12 \advance\leap by \year %dow = (13 * (month + 10 - (month + 10)/13*12) - 1)/5 \dow=\month \advance\dow by 10 \y=\dow \divide\y by 13 \multiply\y by 12 \advance\dow by -\y \multiply\dow by 13 \advance\dow by -1 \divide\dow by 5 %dow += day + 77 + 5 * (leap % 100)/4 \advance\dow by \day \advance\dow by 77 \x=\leap \y=\x \divide\y by 100 \multiply\y by 100 \advance\x by -\y \multiply\x by 5 \divide\x by 4 \advance\dow by \x %dow += leap / 400 \x=\leap \divide\x by 400 \advance\dow by \x %dow -= leap / 100 * 2; %dow = (dow % 7) \x=\leap \divide\x by 100 \multiply\x by 2 \advance\dow by -\x \x=\dow \divide\x by 7 \multiply\x by 7 \advance\dow by -\x \ifcase\dow Sunday\or Monday\or Tuesday\or Wednesday\or Thursday\or Friday\or Saturday\fi \ %% %% %% \newcount\cent% Century number (1979 == 20) \newcount\epact% Age of the moon on Jan. 1 \newcount\diy% Day in the year \newcount\golden% Moon's golden number \newcount\x% Temp \newcount\m% Temp for modulus \def\PhaseOfMoon\%Calculate the phase of the (civil) moon. % % The routine calculates the year's epact (the age of the moon on Jan 1.), % adds this to the number of days in the year, and calculates the phase % of the moon for this date. It returns the phase as a string, e.g., % "new", "full", etc. % % In the algorithm: % %diyIs the day of the year - 1 (i.e., Jan 1 is day 0). % %goldenIs the number of the year in the Mentonic cycle, used to %determine the position of the calender moon. % %epactIs the age of the calender moon (in days) at the beginning %of the year. To calculate epact, two century-based %corrections are applied: %Gregorian:(3 * cent)/4 - 12 %is the number of years such as 1700, 1800 when %leap year was not held. %Clavian:(((8 * cent) + 5) / 25) - 5 %is a correction to the Mentonic cycle of about %8 days every 2500 years. Note that this will %overflow 16 bits in the year 409600. Beware. % % The algorithm is accurate for the Gregorian calender only. % % The magic numbers used in the phase calculation are as follows: % 29.5The moon's period in days. %17729.5 scaled by 6 % 22(29.5 / 8) scaled by 6 (this gets the phase) % 11((29.5 / 8) / 2) scaled by 6 % % Theoretically, this should yield a number in the range 0 .. 7. However, % two days per year, things don't work out too well. % % Epact is calculated by the algorithm given in Knuth vol. 1 (calculation % of Easter). See also the article on Calenders in the Encyclopaedia % Britannica and Knuth's algorithm in CACM April 1962, page 209. % \diy=\day \advance\diy by \ifcase\month% Jan 1 == 0 -1\or -1\or 30\or 58\or 89\or 119\or 150\or% Jan .. Jun 180\or 211\or 241\or 272\or 303\or 333\fi% Jul .. Dec %if ((month > 2) && ((year % 4 == 0) && % ((year % 400 == 0) \\ (year % 100 != 0)))) %diy++;/* Leapyear fixup*/ \ifnum \month>2 \x=\year \m=\x \divide\m by 4 \multiply\m by 4 \advance\x by -\m \ifnum \x=0% month > 2 and maybe leapyear \x=\year \m=\x \divide\m by 400 \multiply\m by 400 \advance\x by -\m \ifnum \x=0% 2000 is a leap year \advance\diy by 1% so it's one day later \else% not 2000, check other '00's \x=\year \m=\x \divide\m by 100 \multiply\m by 100 \advance\x by -\m \ifnum \x>0% not some other '00' year \advance\diy by 1% it's still one day later \fi% not odd century \fi% not 2000-type century \fi% not leapish year \fi% not march or later %cent = (year / 100) + 1;/* Century number*/ %golden = (year % 19) + 1;/* Golden number*/ \cent=\year \divide\cent by 100 \advance\cent by 1 \golden=\year \m=\year \divide\m by 19 \multiply\m by 19 \advance\golden by -\m \advance\golden by 1 %epact = ((11 * golden) + 20/* Golden number*/ %+ (((8 * cent) + 5) / 25) - 5/* 400 year cycle*/ %- (((3 * cent) / 4) - 12)) % 30;/* Leap year correction*/ \epact=11 \multiply\epact by \golden \advance\epact by 20 \x=8 \multiply\x by \cent \advance\x by 5 \divide\x by 25 \advance\x by -5 \advance\epact by \x \x=3 \multiply\x by \cent \divide\x by 4 \advance\x by -12 \advance\epact by -\x \m=\epact \divide\m by 30 \multiply\m by 30 \advance\epact by -\m %if (epact <= 0) %epact += 30;/* Age range is 1 .. 30*/ %if ((epact == 25 && golden > 11) \\ epact == 24) %epact++; \ifnum \epact<0 \advance\epact by 30 \fi \ifnum \epact=25 \ifnum \golden>11 \advance \epact by 1 \fi \else \ifnum \epact=24 \advance \epact by 1 \fi \fi % % Calculate the phase, using the magic numbers defined above. % Note that phase may be equal to 8 (== 0) on two days of the year % due to the way the algorithm was implemented. %phase = (((((diy + epact) * 6) + 11) % 177) / 22) & 7; % \x=\diy \advance\x by \epact \multiply\x by 6 \advance\x by 11 \m=\x \divide\m by 177 \multiply\m by 177 \advance\x by -\m \divide\x by 22 \ifcase\x new\or waxing crescent\or in its first quarter\or waxing gibbous\or full\or waning gibbous\or in its last quarter\or waning crescent\or new\fi