পঞ্জিকার “গ্রহস্ফুট” একটি দীর্ঘ calculation chain-এর শেষ ফল। একটি দিন বা মুহূর্তকে প্রথমে epoch থেকে অতিক্রান্ত দিনের সংখ্যায় রূপান্তর করা হয়; তারপর প্রতিটি গ্রহের যুগগত আবর্তন থেকে তার সমবেগে চলা মধ্যম অবস্থান পাওয়া যায়। কিন্তু আকাশে গ্রহের গতি সমবেগে দেখা যায় না। তাই মন্দ ও শীঘ্র সংশোধন প্রয়োগ করে ঐতিহ্যগত স্পষ্ট অবস্থান নির্ণয় করা হয়।
মধ্যম গ্রহ ও স্পষ্ট গ্রহ এক নয়
মধ্যম গ্রহ হলো একটি ideal uniform-motion model-এর ফল। ধরে নেওয়া হয়, গ্রহটি নির্দিষ্ট দীর্ঘ সময়ে নির্দিষ্ট সংখ্যক আবর্তন সম্পন্ন করে এবং প্রতিদিন সমান angular distance অতিক্রম করে। এই অবস্থান calculation-এর অপরিহার্য intermediate value, কিন্তু সরাসরি দৃশ্যমান অবস্থান নয়।
স্পষ্ট গ্রহ বা traditional true position হলো মধ্যম অবস্থানের ওপর সংশ্লিষ্ট correction model প্রয়োগের ফল। সূর্য ও চন্দ্রের জন্য প্রধানত মন্দ-সংশোধন, আর পাঁচ দৃশ্যমান গ্রহের জন্য মন্দ ও শীঘ্র—দুই ধরনের correction লাগে।
| স্তর | অর্থ | ব্যবহার |
|---|---|---|
| মধ্যম অবস্থান | অহর্গণ ও আবর্তন-ধ্রুবক থেকে সমবেগে গণিত longitude | পরবর্তী correction-এর base value |
| মন্দফল | মধ্যম অবস্থান ও মন্দোচ্চের angular relation থেকে correction | অসম apparent speed-এর traditional model |
| শীঘ্রফল | সূর্য–গ্রহের আপেক্ষিক geometry থেকে correction | বুধ, শুক্র, মঙ্গল, বৃহস্পতি ও শনির true position |
| স্পষ্ট অবস্থান | ঘোষিত sequence-এ সব correction-এর পর longitude | রাশি, পদ, গ্রহস্ফুট ও comparative report |
যুগ ও আবর্তন-ধ্রুবক
Traditional engine একটি মহাযুগে নক্ষত্র, সূর্য, চন্দ্র, গ্রহ, চন্দ্রোচ্চ ও রাহুর মোট আবর্তন-সংখ্যা সংরক্ষণ করে। বর্তমান project engine-এর মূল constants-এর একটি সংক্ষিপ্ত রূপ:
| চলক | মূল আবর্তন | ব্যাখ্যা |
|---|---|---|
| নক্ষত্র | ১,৫৮২,২৩৭,৮০০ | নাক্ষত্রিক ঘূর্ণন-ভিত্তিক civil-day derivation |
| সূর্য | ৪,৩২০,০০০ | সূর্যের mean revolution |
| চন্দ্র | ৫৭,৭৫৩,৩৩৬ | চন্দ্রের mean revolution |
| বুধ | ১৭,৯৩৭,০০০ | বুধের শীঘ্র-চক্রে ব্যবহৃত constant |
| শুক্র | ৭,০২২,৩৮৮ | শুক্রের শীঘ্র-চক্রে ব্যবহৃত constant |
| মঙ্গল | ২,২৯৬,৮২৪ | মঙ্গলের mean revolution |
| বৃহস্পতি | ৩৬৪,২২০ | বৃহস্পতির mean revolution |
| শনি | ১৪৬,৫৬৪ | শনির mean revolution |
| চন্দ্রোচ্চ | ৪৮৮,২১৯ | চন্দ্রের apogee motion |
| রাহু | −২৩২,২২৬ | node-এর বিপরীতমুখী motion |
এই সংখ্যাগুলি modern orbital elements নয়; এগুলি নিজস্ব traditional system-এর অংশ। তাই একটি constant আধুনিক observation-এর সঙ্গে মিলিয়ে ইচ্ছামতো বদলালে সেই পরিবর্তনের প্রভাব civil days, mean positions, calendar elements এবং long-term historical continuity-তে ছড়িয়ে পড়তে পারে।
অহর্গণ: calculation-এর সময়-অক্ষ
অহর্গণ হলো নির্বাচিত epoch থেকে অতিক্রান্ত দিনের ধারাবাহিক সংখ্যা। Gregorian বা Julian year–month–day হলো মানুষের calendar label; planetary equations-এর জন্য এগুলিকে প্রথমে একটি continuous day count-এ রূপান্তর করা সুবিধাজনক।
= 360° × Fraction(Revolutions × Ahargana ÷ CivilDays)
Fraction শুধু পূর্ণ আবর্তনের পর অবশিষ্ট অংশ রাখে। ফলকে সবসময় ০° ≤ longitude < ৩৬০° সীমায় normalize করতে হয়। Negative node motion বা wrap-around-এর জন্য এই normalization বাধ্যতামূলক।
বর্তমান C# engine UTC instant-কে Julian Day-এ রূপান্তর করে, তারপর উজ্জয়িনীর reference longitude-এর সঙ্গে সামঞ্জস্য রেখে ahargana তৈরি করে। উল্টো conversion-এ একই offset বিপরীত চিহ্নে ফেরত দেওয়া হয়। Round-trip test—UTC → ahargana → UTC—তাই গুরুত্বপূর্ণ।
অব্দপিণ্ড ও দিনবৃন্দ: report-এর intermediate audit values
Printed Panjika ও বিভিন্ন করণ-গ্রন্থে বার্ষিক calculation-এর intermediate aggregate-কে অব্দপিণ্ড, দিনবৃন্দ বা কাছাকাছি regional নামে দেখানো হতে পারে। সব গ্রন্থে এই নামের formula এক নয়। কোনো বইয়ের table port করার সময় প্রথমে সেই edition-এর সংজ্ঞা, epoch, expired/current year convention এবং remainder-divisor লিখে রাখা জরুরি।
Software report-এ এই দুটি field রাখা যেতে পারে, তবে শুধু label অনুকরণ না করে তাদের provenance প্রকাশ করা উচিত:
- কোন traditional text বা printed table-এর formula ব্যবহৃত হয়েছে;
- শকাব্দ, বঙ্গাব্দ, কলিযুগ বা Gregorian—কোন year input নেওয়া হয়েছে;
- year elapsed না current;
- কোন quotient ও remainder রাখা হয়েছে;
- শেষে কোন day count বা ahargana-তে তা map হয়েছে।
দেশান্তর: উজ্জয়িনী থেকে নির্বাচিত স্থানের দ্রাঘিমা
Traditional calculation-এর reference meridian হিসেবে বর্তমান engine উজ্জয়িনীর দ্রাঘিমা ৭৫.৮° পূর্ব ব্যবহার করে। নির্বাচিত স্থানের longitude-এর পার্থক্যকে এক দিনের fraction-এ রূপান্তর করা হয়:
= (SelectedLongitude − 75.8°) ÷ 360°
Dhaka বা Kolkata উজ্জয়িনীর পূর্বে; New York পশ্চিমে। তাই signed longitude বজায় রাখতে হবে। বর্তমান legacy sunrise flow-এ provisional ahargana তৈরি হয়:
double desantara = (request.Longitude - UjjainLongitude) / 360.0;
double provisional = baseAhar + 0.25 - desantara;
এখানে ০.২৫ দিন ছয় ঘণ্টার fraction; পরবর্তী daylight equation ও sunrise logic classical sunrise ahargana নির্ধারণ করে। দেশান্তর একটি longitude correction—timezone offset নয়। Local civil time, timezone/DST এবং deśāntara তিনটি আলাদা স্তর।
বীজ সংশোধন: ধ্রুবক বদলানোর নিয়ন্ত্রিত ধাপ
দীর্ঘ সময়ের accumulated difference সামঞ্জস্য করতে traditional program-এ আবর্তন-সংখ্যার ওপর ছোট বীজ সংশোধন প্রয়োগ করা হয়। এই project-এর port M. Yano ও M. Fushimi-এর pancanga 3.14–এর add_bija() অনুসরণ করে। বর্তমান canonical corrections:
| চলক | যোগ/বিয়োগ | ফল |
|---|---|---|
| নক্ষত্র | +২৮ | canonical star correction |
| বুধ | +৬০ | corrected revolution constant |
| শুক্র | −১২ | corrected revolution constant |
| মঙ্গল | +৮ | corrected revolution constant |
| শনি | +৪ | corrected revolution constant |
| চন্দ্রোচ্চ | −১৬ | corrected apogee motion |
| রাহু | −১২ | corrected node motion |
বীজ একবারই প্রয়োগ করতে হবে। Raw constants আগে হাতে বদলে রেখে আবার ApplyBijaCorrection() চালালে double correction হবে। তাই engine initialization-এ raw table → optional canonical Bīja → derived counts—এই একমুখী sequence রাখুন।
void ApplyBijaCorrection()
{
yr["star"] += starCorrection;
yr["mercury"] += 60;
yr["venus"] -= 12;
yr["mars"] += 8;
yr["saturn"] += 4;
yr["Candrocca"] -= 16;
yr["Rahu"] -= 12;
}
এরপর derived quantities পুনর্গণনা হয়:
SynodicMonths = MoonRevolutions − SunRevolutions
AdhimāsaCount = SynodicMonths − 12 × SunRevolutions
TithiCount = 30 × SynodicMonths
Kṣayadina = TithiCount − CivilDays
মধ্যম longitude নির্ণয়
Engine-এর core mean-motion function অত্যন্ত সংক্ষিপ্ত:
double Mean(double ahar, double rotation)
{
return 360.0 * Frac(rotation * ahar / civilDays);
}
এই function-এর input হলো exact ahargana এবং সংশ্লিষ্ট revolution constant। Output degree-তে একটি normalized mean longitude। Report-এ raw double অন্তত পর্যাপ্ত decimal precision-এ রাখতে হবে; UI-তে পরে degree–minute–second বা রাশি–অংশ–কলা format করা হবে।
Mean position পুনরুৎপাদনের জন্য report metadata-তে ahargana, civil days, Bīja enabled/disabled, star correction value এবং engine version রাখুন। শুধু formatted “মেষ ১২°” সংরক্ষণ করলে calculation audit সম্ভব নয়।
মন্দ সংশোধন
মন্দ correction-এ mean planet এবং তার মন্দোচ্চের difference থেকে anomaly গঠিত হয়। Model-এর circumference parameter ও sine relation ব্যবহার করে একটি angular equation পাওয়া যায়:
Manda equation ≈ arcsin((Circumference ÷ 360) × sin(argument))
Corrected longitude = MeanPlanet − signed Manda equation
সাইন বা চিহ্ন quadrant অনুযায়ী পরিবর্তিত হয়; একটি absolute value নিয়ে সব ক্ষেত্রে বিয়োগ করা যাবে না। Current engine-এর Manda() function এবং caller sequence-কে একসঙ্গে test করতে হবে।
সূর্যের traditional true longitude মূলত mean Sun থেকে manda equation বাদ দিয়ে পাওয়া হয়। চন্দ্রের ক্ষেত্রে mean lunar apogee—Candrocca motion থেকে নির্মিত—ব্যবহার করে lunar manda correction করা হয়।
শীঘ্র সংশোধন
পাঁচ গ্রহে শীঘ্র correction সূর্য ও গ্রহের আপেক্ষিক configuration model করে। বুধ ও শুক্রের জন্য তাদের শীঘ্র motion সূর্যকেন্দ্রিক relation-এ ব্যবহৃত হয়; মঙ্গল, বৃহস্পতি ও শনির sequence-এ mean Sun এবং mean planet-এর relation ভিন্নভাবে প্রবেশ করে।
বর্তমান engine প্রথমে একটি শীঘ্র correction-এর অর্ধাংশ নিয়ে manda argument সংশোধন করে, তারপর manda correction-এর অর্ধাংশ দিয়ে আরেক intermediate position তৈরি করে। Final manda-এর পর আবার শীঘ্র correction প্রয়োগ করে true longitude পাওয়া হয়।
m₁ = Mean + e₁ ÷ 2
e₂ = Manda correction at m₁
m₂ = m₁ − e₂ ÷ 2
e₃ = Manda correction at m₂
m₃ = Mean − e₃
True = Normalize(m₃ + Final Sighra correction)
এখানে অর্ধ correction-গুলি rounding-এর আগেই double precision-এ রাখা দরকার। প্রতি ধাপে Bengali DMS string বানিয়ে আবার parse করলে minute/second rounding জমে final longitude বদলে যেতে পারে।
সূর্য, চন্দ্র, রাহু–কেতু ও পাঁচ গ্রহের calculation chain
| গ্রহ/বিন্দু | প্রধান input | Correction chain |
|---|---|---|
| সূর্য | Mean Sun, solar mandocca | Mean → Manda → True Sun |
| চন্দ্র | Mean Moon, mean Candrocca | Mean → Lunar Manda → True Moon |
| বুধ ও শুক্র | Mean Sun, own sighra, mandocca | Sighra½ → Manda½ → full Manda → final Sighra |
| মঙ্গল, বৃহস্পতি ও শনি | Own mean planet, Mean Sun, mandocca | Sighra½ → Manda½ → full Manda → final Sighra |
| রাহু | Negative node revolution | Mean node normalized to zodiac convention |
| কেতু | রাহুর বিপরীত বিন্দু | Normalize(Rahu + 180°) |
বক্রগতি দেখাতে শুধু “আজকের longitude গতকালের চেয়ে ছোট” পরীক্ষা যথেষ্ট নয়, কারণ ৩৫৯° থেকে ০° crossing ঘটতে পারে। Wrap-aware signed angular difference ব্যবহার করুন:
double SignedDelta(double later, double earlier)
{
double d = Normalize(later - earlier);
return d > 180.0 ? d - 360.0 : d;
}
bool retrograde = SignedDelta(tomorrow, today) < 0.0;
মেষ সংক্রান্তিতে বার্ষিক Mean Planet report
বাংলা বছরের শুরুতে yearly report তৈরি করতে civil midnight বা ১ বৈশাখের sunrise নয়, ঘোষিত Surya Siddhanta branch-এ True Sun-এর নিরয়ণ longitude ০° অতিক্রমের exact instant খুঁজতে হবে। এটিই মেষ সংক্রান্তির root event।
Root-finding flow:
- Expected date-এর আগে ও পরে True Sun longitude sample করে crossing bracket করুন;
- ৩৬০°/০° wrap unwrap করে signed function তৈরি করুন;
- Bisection বা Brent method-এ second-level tolerance পর্যন্ত event time বের করুন;
- একই instant-এর UTC, local time, Julian Day এবং ahargana freeze করুন;
- সেই ahargana-তেই সব mean ও true planet calculation চালান;
- Report header-এ location, timezone, mode, engine version ও correction profile লিখুন।
Report-এর একটি audit-friendly বিন্যাস:
| Section | প্রস্তাবিত data |
|---|---|
| Event identity | বাংলা বছর, মেষ সংক্রান্তি local time, UTC, Julian Day |
| Reference | Latitude, longitude, timezone ID, UTC offset, Ujjain longitude |
| Time counts | Ahargana; source-defined Abda Piṇḍa ও Dinavṛnda থাকলে formula ID-সহ |
| Bīja | Raw constant, correction, corrected constant—তিন column |
| Deśāntara | Degree difference, day fraction এবং time-equivalent |
| Mean planets | Raw degrees, normalized degrees, rāśi–aṁśa–kalā |
| Corrections | Mandocca, manda equation, sighra equation ও intermediate values |
| True planets | Final longitude, রাশি, নক্ষত্র-পদ, direct/retrograde flag |
| Comparative | ঐচ্ছিক Swiss Ephemeris value ও signed difference—স্পষ্ট আলাদা label-এ |
True Sun event-এ ০° হওয়ার কথা, কিন্তু mean Sun সাধারণত ০° হবে না—কারণ manda correction-এর পরেই true longitude মেষে প্রবেশ করেছে। এই পার্থক্য report-এর error নয়; বরং mean ও true position আলাদা হওয়ার দৃশ্যমান উদাহরণ।
Post-1947 Modern Fit correction-এর সীমানা
Printed Bengali Panjika-এর আধুনিক সংক্রান্তি ও বাংলা solar date মিলানোর জন্য project-এ ১৯৪৭ থেকে মাসভিত্তিক dynamic star-correction profile ব্যবহার করা হয়েছে। পরীক্ষিত profile:
31, 20, 23, 48, 51, 39, 33, 39, 43, 32, 30, 34
এই calibration-এর উদ্দেশ্য হলো modern printed tradition-এর Saṅkrānti এবং Bengali solar date-এর সঙ্গে fit করা। এটি canonical Bīja table-এর universal replacement নয়। Architecture-এ আলাদা policy রাখুন:
| Calculation | Canonical Traditional | Post-1947 Modern Fit |
|---|---|---|
| ঐতিহাসিক গ্রহস্ফুট | Canonical star +২৮ | প্রয়োগ নয় |
| তিথি | Canonical engine | প্রয়োগ নয় |
| নক্ষত্র, যোগ, করণ | Canonical engine | প্রয়োগ নয় |
| গ্রহণ | Canonical বা ঘোষিত Drik branch | প্রয়োগ নয় |
| Saṅkrānti event | Historical mode | ১৯৪৭+ selected month correction |
| বাংলা solar date | Historical mode | ১৯৪৭+ selected month correction |
Traditional Surya Siddhanta ও Drik result কীভাবে তুলনা করবেন?
Traditional result এবং Swiss Ephemeris result দুই ভিন্ন model-এর output। তাদের difference দেখানো উপকারী, কিন্তু একটিকে অন্যটির “correction” হিসেবে মাঝপথে ঢুকিয়ে hybrid result তৈরি করা উচিত নয়।
| বিষয় | Traditional branch | Drik branch |
|---|---|---|
| মূল data | যুগগত revolution constants ও traditional equations | Modern numerical ephemeris |
| Reference | Traditional epoch ও Ujjain convention | Julian Day, UT/TT এবং selected ephemeris |
| Zodiac | নিজস্ব traditional nirayana framework | Declared ayanāṃśa, যেমন Lahiri |
| উদ্দেশ্য | ঐতিহাসিক পঞ্জিকা ও model reproduction | Modern astronomical position ও comparison |
| Expected relation | Difference থাকা স্বাভাবিক; mode ও metadata প্রকাশ করতে হবে | |
Comparison table-এ একই instant ও একই longitude convention নিশ্চিত করুন। Swiss output tropical হলে আগে declared ayanāṃśa অনুযায়ী sidereal করুন; geocentric ও topocentric value মিশাবেন না; এবং “true”, “apparent”, “mean” flags প্রকাশ করুন।
C# implementation policy
Calculation, profile selection, report model ও rendering আলাদা রাখলে historical এবং Modern Fit branch নিরাপদ থাকে:
| Component | দায়িত্ব |
|---|---|
SuryaSiddhantaConstants | Immutable raw revolution, mandocca ও circumference data |
BijaProfile | Canonical Bīja values; একবার প্রয়োগের নিশ্চয়তা |
AharganaConverter | UTC/JD ↔ ahargana এবং Ujjain reference |
TraditionalPlanetEngine | Mean, manda, sighra ও true longitude |
SankrantiCorrectionProfile | ১৯৪৭+ month-wise Modern Fit; শুধু solar-date branch |
MeshaIngressFinder | True Sun ০° crossing root solve |
YearlyPlanetReport | Raw numeric audit data ও metadata |
YearlyPlanetReportRenderer | HTML, print ও XML formatting |
Profile object immutable হলে একই request-এর মাঝখানে star correction বদলে যাওয়ার ঝুঁকি কমে:
public sealed class CalculationProfile
{
public string Id { get; init; }
public bool ApplyCanonicalBija { get; init; }
public int CanonicalStarCorrection { get; init; }
public bool ModernSankrantiFit { get; init; }
public int ModernFitCutoffYear { get; init; }
}
// Planetary and panchanga calculations
var traditional = Profiles.CanonicalSuryaSiddhanta;
// Only Sankranti and Bengali solar-date calculations
var solarCalendar = Profiles.ModernPrintedFit1947;
Report model-এ formatted Bengali string-এর পাশাপাশি raw numeric values রাখুন। XML export-এ machine-readable degree, JD এবং ahargana attributes দিলে ভবিষ্যতে table পুনরায় যাচাই করা যাবে।
Validation checklist
- Raw constants-এর snapshot test;
- Bīja enabled/disabled—দুই mode এবং exactly-once test;
- Derived civil days ও synodic-month counts;
- Mean longitude সবসময় ০°–৩৬০°;
- Negative Rahu revolution এবং Rahu–Ketu ১৮০° opposition;
- UTC → ahargana → UTC round-trip;
- Dhaka, Kolkata ও New York-এ deśāntara sign;
- Gregorian/Julian conversion boundary-তে continuous JD;
- Manda equation-এর চার quadrant;
- প্রতিটি গ্রহের intermediate correction golden values;
- ৩৫৯.৯° → ০.১° crossing-এ direct motion;
- Retrograde station-এর দুই পাশে signed delta;
- Mesha ingress root-এর আগে Sun < ০° এবং পরে Sun ≥ ০°—unwrapped scale-এ;
- Exact ingress instant-এ True Sun tolerance-এর মধ্যে ০°;
- Historical mode-এ বছর ১–১৪৩৩ batch continuity;
- ১৯৪৬ ও ১৯৪৭ boundary-তে profile selection;
- Modern Fit tithi/nakṣatra/yoga/karana ও graha result বদলায় না;
- HTML, print ও XML-এ একই raw report ID;
- Swiss comparison-এ একই UTC instant, zodiac mode ও coordinate type।
Golden test-এর source হিসেবে নির্দিষ্ট printed Panjika ব্যবহার করলে edition, publication place, year, page এবং পড়া time-unit লিখুন। একটি scanned value ভুল পড়া হতে পারে; তাই single-book fit-কে universal truth না ধরে multiple-source evidence রাখুন।
উপসংহার
সূর্য সিদ্ধান্তের গ্রহগণনা একটি ধারাবাহিক model: epoch ও আবর্তন-ধ্রুবক → অহর্গণ → মধ্যম longitude → মন্দ ও শীঘ্র correction → স্পষ্ট longitude। দেশান্তর selected location-কে Ujjain reference-এর সঙ্গে যুক্ত করে; Bīja দীর্ঘমেয়াদি constants-এর ঘোষিত adjustment; আর Abda Piṇḍa বা Dinavṛnda-র মতো printed intermediate values source-specific সংজ্ঞা ছাড়া ব্যবহার করা উচিত নয়।
মেষ সংক্রান্তির yearly report-এ একই exact event instant-এ mean ও true planets, Bīja table, deśāntara এবং audit metadata ধরলে ফল গবেষণাযোগ্য হয়। Traditional এবং Drik value পাশাপাশি দেখানো যায়, কিন্তু তাদের engine ও terminology মেশানো যাবে না।
সবচেয়ে গুরুত্বপূর্ণ software boundary হলো canonical engine ও post‑1947 Modern Fit-এর বিচ্ছেদ। মাসভিত্তিক star calibration modern Bengali Saṅkrānti ও solar date-এর জন্য; এটি tithi, nakṣatra, yoga, karaṇa, eclipse, historical planet বা canonical yearly mean-planet report বদলাবে না। এই separation-ই project-কে একই সঙ্গে printed tradition-এর উপযোগী এবং historical research-এর জন্য স্বচ্ছ রাখে।
তথ্যসূত্র ও আরও পাঠ
- Ebenezer Burgess, Translation of the Sûrya-Siddhânta: A Text-book of Hindu Astronomy, Journal of the American Oriental Society, Vol. 6, 1860; বিশেষত mean motions ও true places অধ্যায়।
- M. Yano ও M. Fushimi—Pancanga 3.14; Surya Siddhanta–ভিত্তিক traditional calendar program.
- Pancanga 3.14 message and program notes; source history, model scope ও version notes.
- Astrodienst—Swiss Ephemeris Programmer’s Documentation; modern ephemeris comparison-এর flags, time scale ও coordinate conventions.
- Astrodienst—official Swiss Ephemeris source repository.
- সূর্য সিদ্ধান্ত পঞ্জিকা project,
SuryaSiddhantaEngine.cs; revolution constants, Bīja, ahargana, deśāntara, mean, manda ও sighra implementation. - Project research notes: post‑1947 Modern Fit Sankranti Star Correction table এবং canonical/historical calculation boundary.
মন্তব্য, আলোচনা ও প্রশ্ন