summaryrefslogtreecommitdiff
path: root/macros/generic/misc/dayofweek.tex
blob: 4ce46ac2434c92894f2f7d5d46b85b2e133765d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
%
%	\DayOfWeek	expands to the day of the week ("Sunday", etc.)
%	\PhaseOfMoon	expands to the phase of the moon
%
%	Written by Martin Minow of DEC (minow%bolt.dec@decwrl.dec.com).
%
\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
}
%%
%%
%%
\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:
%
%	diy	Is the day of the year - 1 (i.e., Jan 1 is day 0).
%
%	golden	Is the number of the year in the Mentonic cycle, used to
%		determine the position of the calender moon.
%
%	epact	Is 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.5		The moon's period in days.
%	177		29.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.
%
  \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
  \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
}