[3ae31e9] | 1 |
|
---|
| 2 |
|
---|
| 3 |
|
---|
| 4 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
| 5 |
|
---|
| 6 |
|
---|
| 7 |
|
---|
| 8 | NNNNAAAAMMMMEEEE
|
---|
| 9 | greg - compute details of Gregorian calendar
|
---|
| 10 |
|
---|
| 11 | SSSSYYYYNNNNTTTTAAAAXXXX
|
---|
| 12 | ggggrrrreeeegggg YYYYeeeeaaaarrrr MMMMoooonnnntttthhhh DDDDaaaayyyyOOOOffffMMMMoooonnnntttthhhh [[[[DDDDaaaayyyyOOOOffffWWWWeeeeeeeekkkk WWWWeeeeeeeekkkkOOOOffffMMMMoooonnnntttthhhh DDDDaaaayyyyOOOOffffYYYYeeeeaaaarrrr
|
---|
| 13 | JJJJuuuulllliiiiaaaannnnDDDDaaaayyyy]]]]
|
---|
| 14 |
|
---|
| 15 | SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
|
---|
| 16 | _G_r_e_g provides calendar information. It approximates the
|
---|
| 17 | functionality of unix cal except that the information is
|
---|
| 18 | provided in a way that is appropriate for use in other
|
---|
| 19 | programs rather than visual display.
|
---|
| 20 |
|
---|
| 21 | The internal function "gregorian" is designed to be used as
|
---|
| 22 | a component of other programs.
|
---|
| 23 |
|
---|
| 24 | DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
|
---|
| 25 | The program is invertible in the sense of a logic
|
---|
| 26 | programming predicate. That is, inputs with positive values
|
---|
| 27 | are checked for consistency; missing inputs (indicated by
|
---|
| 28 | otherwise illegal value 0) are given the correct positive
|
---|
| 29 | value if possible.
|
---|
| 30 |
|
---|
| 31 | If all the output is correct, the program will exit with 0.
|
---|
| 32 |
|
---|
| 33 | If the input cannot be reconciled, the program will exit
|
---|
| 34 | with 1.
|
---|
| 35 |
|
---|
| 36 | If the input leaves the output indeterminate, the program
|
---|
| 37 | will exit with 2.
|
---|
| 38 |
|
---|
| 39 | If the C implementation cannot support the calculation
|
---|
| 40 | because of arithmetic precision, the program will exit with
|
---|
| 41 | 3.
|
---|
| 42 |
|
---|
| 43 | PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS
|
---|
| 44 | There are seven related inputs. Inputs 1-3 are required.
|
---|
| 45 | If inputs 4-7 are omitted, zero is assumed for each.
|
---|
| 46 |
|
---|
| 47 | The _Y_e_a_r is an integer >= _1_5_8_2
|
---|
| 48 |
|
---|
| 49 | The _M_o_n_t_h is an integer between _1 and _1_2.
|
---|
| 50 |
|
---|
| 51 | The _D_a_y_O_f_M_o_n_t_h is an integer between _1 and _2_8, _2_9, _3_0 or _3_1
|
---|
| 52 | depending on the month.
|
---|
| 53 |
|
---|
| 54 | The _D_a_y_O_f_W_e_e_k is an integer between _1 and _7 corresponding to
|
---|
| 55 | _S_u_n_d_a_y, _M_o_n_d_a_y, ... _S_a_t_u_r_d_a_y. It is the column position of
|
---|
| 56 | the date in the conventional monthly calendar tableau.
|
---|
| 57 |
|
---|
| 58 | The _W_e_e_k_O_f_M_o_n_t_h is an integer between _1 and _6 corresponding
|
---|
| 59 | to weeks in the calendar month. It is the row position of
|
---|
| 60 |
|
---|
| 61 |
|
---|
| 62 |
|
---|
| 63 | Page 1 (printed 3/10/86)
|
---|
| 64 |
|
---|
| 65 |
|
---|
| 66 |
|
---|
| 67 |
|
---|
| 68 |
|
---|
| 69 |
|
---|
| 70 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
| 71 |
|
---|
| 72 |
|
---|
| 73 |
|
---|
| 74 | the date in the conventional monthly calendar tableau. The
|
---|
| 75 | first of the month is always in week _1.
|
---|
| 76 |
|
---|
| 77 | The _D_a_y_O_f_Y_e_a_r is an integer between _1 and _3_6_5 or _3_6_6
|
---|
| 78 |
|
---|
| 79 | The _J_u_l_i_a_n_D_a_y is an integer >= _2_2_9_9_1_6_1, corresponding to _1_5
|
---|
| 80 | _O_c_t_o_b_e_r, _1_5_8_2. It measures the time in days from 1 Jan 4713
|
---|
| 81 | BC (Julian calendar). Each julian day starts at noon, GMT
|
---|
| 82 | of the corresponding day of the Gregorian calendar.
|
---|
| 83 | Astronomers express the relation between julian day j and
|
---|
| 84 | date d as dd.5/mm/yyyy = j.0 where both "day"s are real
|
---|
| 85 | numbers. dd.5 is noon of day dd. j.0 is the beginning of
|
---|
| 86 | julian day j.
|
---|
| 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 | Page 2 (printed 3/10/86)
|
---|
| 130 |
|
---|
| 131 |
|
---|
| 132 |
|
---|
| 133 |
|
---|
| 134 |
|
---|
| 135 |
|
---|
| 136 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
| 137 |
|
---|
| 138 |
|
---|
| 139 |
|
---|
| 140 | There are four patterns of input for the seven parameters
|
---|
| 141 | that can possibly give a correct result. They are given
|
---|
| 142 | below. P signifies positive integer (an input). ?
|
---|
| 143 | signifies either 0 (an unknown) or a positive integer (an
|
---|
| 144 | input).
|
---|
| 145 | P P P ? -- year
|
---|
| 146 | P ? P ? -- month of year
|
---|
| 147 | P ? ? ? -- day of month
|
---|
| 148 | ? ? P ? -- day of week
|
---|
| 149 | ? ? P ? -- week of month
|
---|
| 150 | ? P ? ? -- day of year
|
---|
| 151 | ? ? ? P -- julian day
|
---|
| 152 |
|
---|
| 153 | FFFFIIIILLLLEEEESSSS
|
---|
| 154 | none
|
---|
| 155 |
|
---|
| 156 | MMMMEEEETTTTHHHHOOOODDDD
|
---|
| 157 | The Gregorian Calendar was adopted starting October 15, 1582
|
---|
| 158 | (September 14, 1752 in Britain and her colonies). Dates
|
---|
| 159 | prior to adoption were in the Julian Calendar system (no
|
---|
| 160 | relation to julian days). Dates before the conversion are
|
---|
| 161 | denoted OS (old system); dates after the conversion are
|
---|
| 162 | denoted NS (new system). This program will extrapolate
|
---|
| 163 | Gregorian dates back to 1 AD although it will issue a
|
---|
| 164 | warning (inconsistent) for dates prior to the adoption of
|
---|
| 165 | the Gregorian calendar. 1 BC OS immediately preceded 1 AD
|
---|
| 166 | OS (no year 0) so the algorithms are invalid, even for
|
---|
| 167 | extrapolation, prior to 1 AD.
|
---|
| 168 |
|
---|
| 169 | The algorithms, some from the references below, are
|
---|
| 170 | tableless. The collection given here is valid from January
|
---|
| 171 | 1, 1 AD NS. The algorithms, which depend on a number of _a_d
|
---|
| 172 | _h_o_c functions over integers, are cryptic but the alternative
|
---|
| 173 | of using tables does not help much. The notation is C.
|
---|
| 174 | Logical values are to be interpreted as 1 == true and 0 ==
|
---|
| 175 | false. Where it is supposed that the names of the functions
|
---|
| 176 | are not sufficiently mnemonic, an italic comment is
|
---|
| 177 | appended. The code in gregorian.c is algebraically
|
---|
| 178 | simplified where possible when the functions below are back
|
---|
| 179 | substituted into other defining formulas. More than one
|
---|
| 180 | version is given for some formulas.
|
---|
| 181 |
|
---|
| 182 | LeapsBefore(y) == (y-1)/4 - (y-1)/100 + (y-1)/400 _l_e_a_p _y_e_a_r_s _b_e_t_w_e_e_n _1 _A_D _a_n_d _y_e_a_r _y
|
---|
| 183 |
|
---|
| 184 | Leap(y) == LeapsBefore(y+1) - LeapsBefore(y)
|
---|
| 185 |
|
---|
| 186 | Leap(y) == y%400 == 0 || (y%100 != 0 && y%4 == 0)
|
---|
| 187 |
|
---|
| 188 | StonesNumber(y, yd) == (yd + (yd>59+Leap(y))*(2-Leap(y)) + 91)*100
|
---|
| 189 |
|
---|
| 190 | DaysInYearBefore(m, y) == 3055*(m+2)/100 - 91 - (m>2)*(2-Leap(y))
|
---|
| 191 |
|
---|
| 192 |
|
---|
| 193 |
|
---|
| 194 |
|
---|
| 195 | Page 3 (printed 3/10/86)
|
---|
| 196 |
|
---|
| 197 |
|
---|
| 198 |
|
---|
| 199 |
|
---|
| 200 |
|
---|
| 201 |
|
---|
| 202 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
| 203 |
|
---|
| 204 |
|
---|
| 205 |
|
---|
| 206 | DayOfYear(y, m, d) == DaysInYearBefore(m, y) + d
|
---|
| 207 |
|
---|
| 208 | MonthOfYear(y, yd) == StonesNumber(y, yd)/3055 - 2
|
---|
| 209 |
|
---|
| 210 | DayOfMonth(y, yd) == StonesNumber(y, yd)%3055/100 + 1
|
---|
| 211 |
|
---|
| 212 | DaysInYear(y) == 365 + Leap(y)
|
---|
| 213 |
|
---|
| 214 | DaysInYear(y) == DaysInYearBefore(13, y)
|
---|
| 215 |
|
---|
| 216 | DaysInMonth(m, y) == ((m == 2) ? 28+Leap(y) : 30+(m==1 || m%5%3 != 1))
|
---|
| 217 |
|
---|
| 218 | DaysInMonth(m, y) == DaysInYearBefore(m+1, y) - DaysInYearBefore(m, y)
|
---|
| 219 |
|
---|
| 220 | JulianDaysB4(y) == (y-1)*365 + LeapsBefore(y) + 1721425
|
---|
| 221 |
|
---|
| 222 | JulianDay(y, m, d) == JulianDaysBefore(y) + DayOfYear(y, m, d)
|
---|
| 223 |
|
---|
| 224 | YearOf(jd) = 1 + (jd-=(17214256), jd-=(jd+1)/146097, jd+=(jd+1)/36524, jd-(jd+1)/1461)/365
|
---|
| 225 | _y_e_a_r _i_n _w_h_i_c_h _j_u_l_i_a_n _d_a_y _j_d _o_c_c_u_r_s
|
---|
| 226 | DayOf(jd) == jd - JulianDaysBefore(YearOf(jd))
|
---|
| 227 | _g_i_v_e_n _t_h_e _j_u_l_i_a_n _d_a_y _j_d, _d_a_y _o_f _y_e_a_r _f_r_o_m _1 _J_a_n
|
---|
| 228 |
|
---|
| 229 | WeekDay(jd) = (jd+1)%7+1 _S_u_n_d_a_y = _1, _e_t_c.
|
---|
| 230 |
|
---|
| 231 | Week(dm, dw) = (13 + dm - dw)/7
|
---|
| 232 | _w_e_e_k _o_f _m_o_n_t_h _f_r_o_m _d_a_y _o_f _m_o_n_t_h _a_n_d _d_a_y _o_f _w_e_e_k
|
---|
| 233 |
|
---|
| 234 | LLLLIIIIMMMMIIIITTTTSSSS
|
---|
| 235 | Inputs are converted by _a_t_o_i which does not check for non-
|
---|
| 236 | digits. The julian day is, by definition, bounded from
|
---|
| 237 | below by 2299161 (15 October, 1582). The program will fail
|
---|
| 238 | for implementations of C with _s_i_z_e_o_f (_l_o_n_g _i_n_t) < _4. There
|
---|
| 239 | is no practical upper limit on year or julian day. The
|
---|
| 240 | program extrapolates backward correctly to January 1, 1 AD
|
---|
| 241 | NS but reports the input is "inconsistent" prior to October
|
---|
| 242 | 15, 1582.
|
---|
| 243 |
|
---|
| 244 | SSSSEEEEEEEE AAAALLLLSSSSOOOO
|
---|
| 245 | 1. Any almanac, under calendar, perpetual. (Note the World
|
---|
| 246 | Almanac (1985, 1986) gives a julian day incorrect by one).
|
---|
| 247 |
|
---|
| 248 | 2. Any encyclopedia, under calendar.
|
---|
| 249 |
|
---|
| 250 | 3. The Astronomical Ephemeris (any year)
|
---|
| 251 |
|
---|
| 252 | 3. CAL(1). The information supplied by greg corresponds to
|
---|
| 253 | cal starting September 14, 1752 AD.
|
---|
| 254 |
|
---|
| 255 | 4. Elmore, Perpetual Calendar, Am.J.Phys.44,3 (May 1976) pp
|
---|
| 256 | 482-3.
|
---|
| 257 |
|
---|
| 258 |
|
---|
| 259 |
|
---|
| 260 |
|
---|
| 261 | Page 4 (printed 3/10/86)
|
---|
| 262 |
|
---|
| 263 |
|
---|
| 264 |
|
---|
| 265 |
|
---|
| 266 |
|
---|
| 267 |
|
---|
| 268 | GGGGRRRREEEEGGGG((((1111)))) UUUUNNNNIIIIXXXX 5555....0000 ((((llllooooccccaaaallll)))) GGGGRRRREEEEGGGG((((1111))))
|
---|
| 269 |
|
---|
| 270 |
|
---|
| 271 |
|
---|
| 272 | 5. Fliegel & Van Flandern, A Machine Algorithm for
|
---|
| 273 | Processing Calendar Dates, (letter to the editor) CACM 11,10
|
---|
| 274 | (October 1968) pg. 657.
|
---|
| 275 |
|
---|
| 276 | 6. Stone, Tableless Date Conversion. Algorithm 398.
|
---|
| 277 | Collected Algorithms from the CACM (rcvd Jan 1970) and a
|
---|
| 278 | Remark by Robertson (rcvd Dec 1970).
|
---|
| 279 |
|
---|
| 280 | 7. Tantzen, Conversions Between Calendar Date and Julian Day
|
---|
| 281 | Number, Algorithm 199. Collected Algorithms from the CACM
|
---|
| 282 | (August 1963).
|
---|
| 283 |
|
---|
| 284 | 8. Uspensky & Heaslet, Elementary Number Theory, McGraw-
|
---|
| 285 | Hill, (1939) p.206-221.
|
---|
| 286 |
|
---|
| 287 |
|
---|
| 288 |
|
---|
| 289 |
|
---|
| 290 |
|
---|
| 291 |
|
---|
| 292 |
|
---|
| 293 |
|
---|
| 294 |
|
---|
| 295 |
|
---|
| 296 |
|
---|
| 297 |
|
---|
| 298 |
|
---|
| 299 |
|
---|
| 300 |
|
---|
| 301 |
|
---|
| 302 |
|
---|
| 303 |
|
---|
| 304 |
|
---|
| 305 |
|
---|
| 306 |
|
---|
| 307 |
|
---|
| 308 |
|
---|
| 309 |
|
---|
| 310 |
|
---|
| 311 |
|
---|
| 312 |
|
---|
| 313 |
|
---|
| 314 |
|
---|
| 315 |
|
---|
| 316 |
|
---|
| 317 |
|
---|
| 318 |
|
---|
| 319 |
|
---|
| 320 |
|
---|
| 321 |
|
---|
| 322 |
|
---|
| 323 |
|
---|
| 324 |
|
---|
| 325 |
|
---|
| 326 |
|
---|
| 327 | Page 5 (printed 3/10/86)
|
---|
| 328 |
|
---|
| 329 |
|
---|
| 330 |
|
---|
| 331 | |
---|