الگوريتمي براي تقويم جلالي

الگوريتم پيشنهاد شده بر پايه ليست شرح داده شدهٔ سالهايي است كه شكافي درچهارمين سال رايجي كه بعد از ۲۸ يا ۳۶ سال(نه ۳۲ سال) دوره*هاي ۴ ساله ازوقوع قبلي چهار سال رايج پي در پي.در طول ۳۰۰۰ سال تنها در حدود ۲۰ شكاف وجود دارد و آنها اجازهٔ يك بازسازي راحت با ترتيب كامل سالهاي كبيسه جلالي را مي*دهند.

براي مشخص كردن اينكه يك سال جلالي معمولي است يا كبيسه ، تعداد سالهايي را كه از آخرين شكاف جدول 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را نشان مي*دهد. سپس روز اول سال شمسي( اولين روز فروردين) بر حسب روزهاي مارس و سال شمسي مربوطه وجود دارد. در ستون آخر امكان افزايش به(+) و كاهش(-) از شكاف*هاي موجود در جدول ۲ آمده*است.


YearDay ofTeheranDT۱stJalaali Effect ofADMarchtime[min]Farv.year actual error ۶۲۶۲۱۱۲:۰۰٫۴۶۱٫۸۲۲۵ -۹ -۳۸ ۶۵۹۲۱۱۱:۵۶٫۶۵۷٫۹۲۱ ۳۸-۳۸ +۷۱ ۸۸۶۲۰۱۱:۵۷٫۷۳۵٫۶۲۰ ۲۶۵+۲۶۹ +۲۹۸۱۱۱۳۲۱۱۱:۵۸٫۵۲۰٫۰۲۱ ۴۹۲+۴۹۶ +۵۲۵۱۳۷۳۲۰۱۲:۰۱٫۳۷٫۷۲۱ ۷۵۲-۷۵۶ +۷۸۹۲۱۲۴۲۰۱۲:۰۰٫۳۳٫۹۲۱۱۵۰۳+۱۵۰۳ +۱۵۴۰۲۳۲۲۲۱۱۱:۵۸٫۰۱۱٫۰۲۱۱۷۰۱+۱۷۰۵ +۱۷۳۴۲۶۸۱۲۰۱۱:۵۹٫۶۳۲٫۴۲۰۲۰۶۰-۲۰۶۰ -۲۰۹۷۲۷۸۰۲۰۱۲:۰۴٫۸۴۰٫۲۲۱۲۱۵۹+۲۱۵۹ -۲۱۹۲۲۸۱۳۲۰۱۱:۵۶٫۳۴۳٫۰۲۰۲۱۹۲-۲۱۹۲ +۲۲۲۵۲۸۴۶۲۰۱۱:۵۹٫۱۴۵٫۹۲۰۲۲۲۵+۲۲۲۹ -۲۲۶۲۲۸۷۹۲۰۱۲:۰۳٫۵۴۸٫۹۲۱۲۲۵۸-۲۲۶۲ +۲۲۹۵۲۹۱۲۲۰۱۲:۰۳٫۳۵۲٫۰۲۱۲۲۹۱+۲۲۹۱ -۲۳۲۴۳۰۱۱۲۱۱۲:۰۰٫۹۶۱٫۷۲۲۲۳۹۰-۲۳۹۴ +۲۴۲۷۳۰۴۴۲۰۱۲:۰۲٫۲۶۵٫۲۲۱۲۴۲۳+۲۴۲۳ -۲۴۵۶۳۱۷۶۲۰۱۱:۵۶٫۷۷۹٫۹۲۰۲۵۵۵+۲۵۵۹ +۲۵۸۸۳۲۰۹۲۰۱۱:۵۹٫۹۸۳٫۸۲۰۲۵۸۸+۲۵۹۲ +۲۶۲۱۳۳۷۰۲۰۱۲:۱۱٫۰۱۰۴٫۲۲۱۲۷۴۹+۲۷۴۹ +۲۷۸۶۳۴۷۳۲۰۱۱:۴۸٫۲۱۱۸٫۴۲۰۲۸۵۲+۲۸۵۶ +۲۸۸۵۳۵۰۲۲۱۱۲:۱۰٫۴۱۲۲٫۵۲۲۲۸۸۱+۲۸۸۱ +۲۹۱۸۳۶۳۴۲۰۱۲:۰۴٫۵۱۴۲٫۴۲۱۳۰۱۳+۳۰۱۳ +۳۰۵۰۳۶۶۷۲۰۱۲:۰۳٫۸۱۴۷٫۶۲۱۳۰۴۶+۳۰۴۶ +۳۰۸۳