الگوریتمی برای تقویم جلالی
الگوریتم پیشنهاد شده بر پایه لیست شرح داده شدهٔ سالهایی است که شکافی درچهارمین سال رایجی که بعد از ۲۸ یا ۳۶ سال(نه ۳۲ سال) دورههای ۴ ساله ازوقوع قبلی چهار سال رایج پی در پی.در طول ۳۰۰۰ سال تنها در حدود ۲۰ شکاف وجود دارد و آنها اجازهٔ یک بازسازی راحت با ترتیب کامل سالهای کبیسه جلالی را میدهند.
برای مشخص کردن اینکه یک سال جلالی معمولی است یا کبیسه ، تعداد سالهایی را که از آخرین شکاف جدول 1 گذشتهاست، پیدا میکنیم که آن را N می نامیم.با یک استثنا، سال مورد نظر کبیسهاست اگر۱- باضافه باقی مانده N + ۱)/۳۳ )، بر ۴ بخشپذیر باشد یا
lp = MOD[MOD(N + ۱٬۳۳) - ۱٬۴] |
برابر با صفر شود، در اینجا MOD عمل پیدا کردن باقی مانده در حالتیکه اولین نشانوند بر دومی تقسیم میشود را برعهده دارد،استثنا مربوط به موردی که سال مورد نظردر داخل۵ سال پیرو شکاف قرار میگیرد . در این مورد به جای N + ۱ در بالامقدار N + ۱ ± ۴ باید استفاده شود، که علامت + زمانی که سال مطرح شده به یک دورهٔ ۲۹ ساله وابسته باشد و در غیر این صورت علامت - استفاده میشود(به عبارتی در دورههای ۳۷ ساله )
با استفاده از علم حساب اعداد صحیح این الگوریتم به دو خط فورترن(بخش لیست سالهایی که شکاف ایجاد میکنند لازم است.) کاهش مییابد. برای سالهای معمولی باقی مانده تقسیم به ۴ به عبارتی lp تعداد سالهایی که از آخرین سال کبیسه گذشتهاست را مشخص میکند.به عنوان مثال باقی مانده ۱ (۲ یا ۳ ) به این معنی است که سال کبیسه یک سال پیش(۲ یا ۳ سال پیش ) بودهاست .بدیهی است که این ممکن است که بگوید که آیا سال مطرح شده یکی ازچهارمینهای رایج است.این مورد زمانی کهN + ۱ (در مورد استثنا N + ۱ ± ۴) بر ۳۳ بخشپذیر باشد.
برای تبدیل سالهای شمسی به میلادی لازم است تا شماره سالهای کبیسه را از یک مبدا زمانی در هر دو تقویم بیابیم.در تقویم جلالی شماره سالهای کبیسه میان دو شکاف مجاور در جدول ۲ را میگوییم میانyiو yj هست
lj = ۸ INT(Nj/۳۳) + INT[MOD(Nj,۳۳)/۴] |
که Nj = yj - yi وINT تابعی است که قسمت صحیح نشانوند داده شده را بر میگرداند.عددهای lj باید تا زمانی کهyj کمتر از سال سوال شده شود جمع شوند. باقی بماند پس مجموع باید اضافه شود به
۸ INT(N/۳۳) + INT{[MOD(N,33) + ۳]/۴} + k |
عدد سال کبیسه از آخرین شکاف.k تنها زمانیکه سال مطرح شده ۴ سال قبل از شکاف متوالی(yj) قرار بگیرد ،۱ است و در گروه رایج ۳۷ ساله است در غیر این صورت ۰ است.
این الگوریتم نوشته شده به زبان فورترن، زیر روال( JalCal(Jy,leap,Gy,March, که در جدول ۳ نشان داده شدهاست، که برای یک سال جلالی Jy اطلاعات یک سال کبیسه را در متغیرleapبر میگرداند که از ۰ تا ۴ در نظر گرفته شدهاست، که در بالا توضیح داده شدهاست. این روال همچنین تاریخ میلادی مطابق با اولین روز سال جلالی در متغیرGy(سال میلادی)و مارس(چندمین روز مارس) برمی گرداند.بنابراین ازآن مستقیما برای بازگوکردن شروع تقویم ایرانی برای هر سالی در میان حدود ۳۰۰۰ سال ، با تقوم میلادی استفاده کرد.
جدول1: سالهای میلادی(Gy) که پایان یک دورهٔ ۲۹ یا۳۷ ساله رانشان میدهند که شکافی درقانون معتبر ۳۳ ساله ایجاد میکنند. در حدود ۲۰ مارس سال میلادی چهارمین سال رایج تمام میشود و سال کبیسه شمسی آغاز میشود(Jy)
|
Gy |
Jy |
Gy |
Jy |
Gy |
Jy |
Gy |
Jy |
|
۵۶۰ |
-۶۱ |
۱۳۰۷ |
۶۸۶ |
۱۸۳۱ |
۱۲۱۰ |
۲۸۸۳ |
۲۲۶۲ |
۶۳۰ |
۹ |
۱۳۷۷ |
۷۵۶ |
۲۲۵۶ |
۱۶۳۵ |
۲۹۴۵ |
۲۳۲۴ |
۶۵۹ |
۳۸ |
۱۴۳۹ |
۸۱۸ |
۲۶۸۱ |
۲۰۶۰ |
۳۰۱۵ |
۲۳۹۴ |
۸۲۰ |
۱۹۹ |
۱۷۳۲ |
۱۱۱۱ |
۲۷۱۸ |
۲۰۹۷ |
۳۰۷۷ |
۲۴۵۶ |
۱۰۴۷ |
۴۲۶ |
۱۸۰۲ |
۱۱۸۱ |
۲۸۱۳ |
۲۱۹۲ |
۳۷۹۹ |
۳۱۷۸ |
|
|
|
جدول2:
subroutine JalCal(Jy,leap,Gy,March) c This procedure determines if the Jalaali (Persian) year is c leap (۳۶۶-day long) or is the common year (۳۶۵ days), and c finds the day in March (Gregorian calendar) of the first c day of the Jalaali year (Jy) c Input: Jy - Jalaali calendar year (-۶۱ to 3177) c Output: c leap - number of years since the last leap year (۰ to 4) c Gy - Gregorian year of the beginning of Jalaali year c March - the March day of Farvardin the 1st (۱st day of Jy) integer breaks(۲۰),Gy c Jalaali years starting the ۳۳-year rule data breaks/-۶۱٬۹,۳۸٬۱۹۹٬۴۲۶٬۶۸۶٬۷۵۶٬۸۱۸٬۱۱۱۱٬۱۱۸۱, * ۱۲۱۰٬۱۶۳۵٬۲۰۶۰٬۲۰۹۷٬۲۱۹۲٬۲۲۶۲٬۲۳۲۴٬۲۳۹۴٬۲۴۵۶٬۳۱۷۸/ Gy=Jy+۶۲۱ leapJ=-۱۴ jp=breaks(۱) if(Jy.lt.jp.or.Jy.ge.breaks(۲۰)) print'(a,i5,a,i5,a)', *' Bad year number:',Gy,' Gregorian =',Jy,' Jalaali' c Find the limiting years for the Jalaali year Jy do 1 j=۲٬۲۰ jm=breaks(j) jump=jm-jp if(Jy.lt.jm) go to 2 leapJ=leapJ+jump/۳۳*۸+MOD(jump,33)/۴ ۱ jp=jm 2 N=Jy-jp c Find the number of leap years from AD 621 to the beginning c of the current Jalaali year in the Persian calendar leapJ=leapJ+N/۳۳*۸+(MOD(N,33)+۳)/۴ if(MOD(jump,33).eq.۴.and.jump-N.eq.۴) leapJ=leapJ+۱ c and the same in the Gregorian calendar (until the year Gy) leapG=Gy/۴-(Gy/۱۰۰+۱)*۳/۴-۱۵۰ c Determine the Gregorian date of Farvardin the 1st March=۲۰+leapJ-leapG c Find how many years have passed since the last leap year if(jump-N.lt.۶) N=N-jump+(jump+۴)/۳۳*۳۳ leap=MOD(MOD(N+۱٬۳۳)-۱٬۴) if(leap.eq.-۱) leap=۴ en
|
|
این قبیل زیر روال میتواند برای تبدیل کل تاریخ از تقویم ایرانی به کار رود اگر ما به خاطر داشته باشیم که به ازایm (ماه ) و d (روز) تاریخ جلالی
۳۱(m - ۱) - (m - ۷) INT(m/۷) + d
روز از شروع هرسال جلالی(شمسی)سپری شدهاست.
برنامه کاربردی زیر برای تبدیل تاریخ شمسی،ابتدا به روزهای جولین(JD)، سپس به میلادی یا جولین وهمچنین به صورت معکوس،از این تاریخها به تاریخ شمسی نوشته شده و تست شدهاست رویههای ذیل درفورترن که این کارها را انجام میدهند از طرف نویسنده قابل دسترسی هستند. متن کامل برنامه به زبان فورترن نسخه قابل اجرا
تابع(Jal2JD(Jy,m,d ----- تاریخ شمسی را به روزهای جولین براساس ظهر گرینویچ تبدیل میکند.
تابع(JG2JD(JGy,m,d,۱/۰-----تاریخهای میلادی /جولین را به روزهای جولین تبدیل میکند.
تابع(JD2Jal(JDN,Jy,m,d-----------روزهای جولین را به تاریخ شمسی تبدیل میکند
تابع(JD2JG(JDN,JGy,m,d,۱/۰---------روزهای جولین را به تاریخهای میلادی/جولین تبدیل میکند.
بحث خطاها
به علت تقریب طبیعی جدول نجومی که نتیجهٔ آن زمان اعتدالی است ممکن است خطایی در حدود ۱ دقیقهٔ زمان وجود داشته باشد. نا مشخص بودنTD به نتیجه نهایی این خطا اضافه میکند.این پارامترها از مشاهدات مستقیم تنها برای قبل از ۱۶۳۰ بعد از میلاد بسیار واضح هستند.
جدول 3: سالهای بحرانی در تقویم جلالی که بیشتر احتمال دارند تا ترتیب شکافها را تغییر دهند . چهار ستون اول تاریخ میلادی در مارس ، نقطه اعتدالی بهار به زمان متوسط تهران (به ساعت و دقیقه) و متغیرT = TT - UT۱Dرا نشان میدهد. سپس روز اول سال شمسی( اولین روز فروردین) بر حسب روزهای مارس و سال شمسی مربوطه وجود دارد. در ستون آخر امکان افزایش به(+) و کاهش(-) از شکافهای موجود در جدول ۲ آمدهاست.
Year |
Day of |
Teheran |
DT |
۱st |
Jalaali |
Effect of |
AD |
March |
time |
[min] |
Farv. |
year |
actual error |
|
۶۲۶ |
۲۱ |
۱۲:۰۰٫۴ |
۶۱٫۸ |
۲۲ |
۵ |
-۹ -۳۸ |
۶۵۹ |
۲۱ |
۱۱:۵۶٫۶ |
۵۷٫۹ |
۲۱ |
۳۸ |
-۳۸ +۷۱ |
۸۸۶ |
۲۰ |
۱۱:۵۷٫۷ |
۳۵٫۶ |
۲۰ |
۲۶۵ |
+۲۶۹ +۲۹۸ |
۱۱۱۳ |
۲۱ |
۱۱:۵۸٫۵ |
۲۰٫۰ |
۲۱ |
۴۹۲ |
+۴۹۶ +۵۲۵ |
۱۳۷۳ |
۲۰ |
۱۲:۰۱٫۳ |
۷٫۷ |
۲۱ |
۷۵۲ |
-۷۵۶ +۷۸۹ |
۲۱۲۴ |
۲۰ |
۱۲:۰۰٫۳ |
۳٫۹ |
۲۱ |
۱۵۰۳ |
+۱۵۰۳ +۱۵۴۰ |
۲۳۲۲ |
۲۱ |
۱۱:۵۸٫۰ |
۱۱٫۰ |
۲۱ |
۱۷۰۱ |
+۱۷۰۵ +۱۷۳۴ |
۲۶۸۱ |
۲۰ |
۱۱:۵۹٫۶ |
۳۲٫۴ |
۲۰ |
۲۰۶۰ |
-۲۰۶۰ -۲۰۹۷ |
۲۷۸۰ |
۲۰ |
۱۲:۰۴٫۸ |
۴۰٫۲ |
۲۱ |
۲۱۵۹ |
+۲۱۵۹ -۲۱۹۲ |
۲۸۱۳ |
۲۰ |
۱۱:۵۶٫۳ |
۴۳٫۰ |
۲۰ |
۲۱۹۲ |
-۲۱۹۲ +۲۲۲۵ |
۲۸۴۶ |
۲۰ |
۱۱:۵۹٫۱ |
۴۵٫۹ |
۲۰ |
۲۲۲۵ |
+۲۲۲۹ -۲۲۶۲ |
۲۸۷۹ |
۲۰ |
۱۲:۰۳٫۵ |
۴۸٫۹ |
۲۱ |
۲۲۵۸ |
-۲۲۶۲ +۲۲۹۵ |
۲۹۱۲ |
۲۰ |
۱۲:۰۳٫۳ |
۵۲٫۰ |
۲۱ |
۲۲۹۱ |
+۲۲۹۱ -۲۳۲۴ |
۳۰۱۱ |
۲۱ |
۱۲:۰۰٫۹ |
۶۱٫۷ |
۲۲ |
۲۳۹۰ |
-۲۳۹۴ +۲۴۲۷ |
۳۰۴۴ |
۲۰ |
۱۲:۰۲٫۲ |
۶۵٫۲ |
۲۱ |
۲۴۲۳ |
+۲۴۲۳ -۲۴۵۶ |
۳۱۷۶ |
۲۰ |
۱۱:۵۶٫۷ |
۷۹٫۹ |
۲۰ |
۲۵۵۵ |
+۲۵۵۹ +۲۵۸۸ |
۳۲۰۹ |
۲۰ |
۱۱:۵۹٫۹ |
۸۳٫۸ |
۲۰ |
۲۵۸۸ |
+۲۵۹۲ +۲۶۲۱ |
۳۳۷۰ |
۲۰ |
۱۲:۱۱٫۰ |
۱۰۴٫۲ |
۲۱ |
۲۷۴۹ |
+۲۷۴۹ +۲۷۸۶ |
۳۴۷۳ |
۲۰ |
۱۱:۴۸٫۲ |
۱۱۸٫۴ |
۲۰ |
۲۸۵۲ |
+۲۸۵۶ +۲۸۸۵ |
۳۵۰۲ |
۲۱ |
۱۲:۱۰٫۴ |
۱۲۲٫۵ |
۲۲ |
۲۸۸۱ |
+۲۸۸۱ +۲۹۱۸ |
۳۶۳۴ |
۲۰ |
۱۲:۰۴٫۵ |
۱۴۲٫۴ |
۲۱ |
۳۰۱۳ |
+۳۰۱۳ +۳۰۵۰ |
۳۶۶۷ |
۲۰ |
۱۲:۰۳٫۸ |
۱۴۷٫۶ |
۲۱ |
۳۰۴۶ |
+۳۰۴۶ +۳۰۸۳ |
|
ارسال توسط: اشکان عارفی - 23 اسفندماه 1388
به نقل از دانشنامه ویکی پدیا