ေရႊပြဲလာတုိ႕၏ အားေပးမႈ

၂၀၀၉ ခုႏွစ္ ၾသဂုတ္လ ၁ ရက္ေန႕မွစ၍ လက္မွတ္ေစာင္ေရေပါင္း ေစာင္ တိတိ ေရာင္းခ်ခဲ့ရၿပီး ျဖစ္ပါသည္။

အမာခံ ပရိသတ္တုိ႔အတြက္ ...

Thursday, August 27, 2009

အေျဖမွန္ အျမန္ေရြး၊ ပညာသင္ဆု ဘယ္မေ၀း ၂

ကိန္းျပည့္ X ႏွင့္ Y တုိ႕၏ ေျမွာက္လဒ္ XY တြင္ပါ၀င္ေသာ ဂဏန္းမ်ား၏ ပကတိ တန္ဖုိးမ်ားကို ဂဏန္း တစ္လံုးတည္း ရသည္အထိ ေပါင္းလုိက္ေသာ ေပါင္းလဒ္သည္ ကိန္းျပည့္ X တြင္္ ပါ၀င္ေသာ ဂဏန္းမ်ား၏ ပကတိ တန္ဖုိးမ်ားကို ဂဏန္း တစ္လံုးတည္း ရသည္အထိ ေပါင္းလုိက္ေသာ ေပါင္းလဒ္ႏွင့္ က်န္ကိန္းျပည့္ Y တြင္္ ပါ၀င္ေသာ ဂဏန္းမ်ား၏ ပကတိ တန္ဖုိးမ်ားကို ဂဏန္း တစ္လံုးတည္း ရသည္အထိ ေပါင္းလုိက္ေသာ ေပါင္းလဒ္တုိ႕ ေျမွာက္လဒ္ႏွင့္ တူညီေၾကာင္း အေျဖမွန္ အျမန္ေရြး ပညာသင္ဆု ဘယ္မေ၀း ၁ တြင္ ေဖာ္ျပခဲ့ၿပီး ျဖစ္သည္။ ယခု ၄င္း ဂုဏ္သတၱိ မွန္ကန္ေၾကာင္း သက္ေသျပမည္ ျဖစ္သည္။

သက္ေသျပရန္။ ေပးထားေသာ ကိန္းျပည့္တစ္ခု Z = z0 × 100 + z1 × 101 + z2 × 102 + … + zn × 10n အတြက္

မွီခ်က္ f(Z) = f(z0 + z1 + z2 + … + zn) if z0 + z1 + z2 + … + zn > 9;

f(Z) = z0 + z1 + z2 + … + zn otherwise ျဖစ္ပါေစ။ f(XY) = f(f(X).f(Y)) ျဖစ္သည္။

သက္ေသျပခ်က္။

အစားသီ၀ရီ (Theory of Division a.k.a Procedure of Division) အရ မည္သည့္ကိန္းျပည့္ Z ကုိမဆုိ Z = pq + r ပံုစံနဲ႕ ေဖၚျပႏုိင္ပါတယ္ (Z၊ p၊ q ႏွင့္ r တုိ႕သည္ ကိန္းျပည့္မ်ားျဖစ္၍ r သည္ q ထက္အၿမဲငယ္သည္)။ အဲဒီမွာ q = 9 လုိ႕ ထားလုိက္ရင္ မည္သည့္ ကိန္းျပည့္ Z ကုိမဆုိ Z = 9p + r အျဖစ္ ေရးႏုိင္ပါတယ္။ (အဲဒီ p နဲ႕ r ဟာ Z ကုိ q နဲ႕စားလုိ႕ရတဲ့ စားလဒ္နဲ႕ စားၾကြင္းျဖစ္ၿပီး r သည္ 9 ထက္အၿမဲငယ္ေၾကာင္း သတိျပဳပါ။) အဲဒီေတာ့ ကိန္းျပည့္ Z = 9p + r တုိင္းဟာ 9 နဲ႕ စားရင္ p ရၿပီး r ၾကြင္းပါတယ္။

ကိန္းျပည့္ Z မွာပါတဲ့ ဂဏန္းေတြရဲ႕ မူလတန္ဖုိးေတြအားလံုး ကိန္းတစ္လံုးထဲျဖစ္ေအာင္ ေပါင္းတဲ့ ရလဒ္ f(Z) ဟာ အဲဒီကိန္းျပည့္ Z ကုိ 9 နဲ႕စားလုိ႕ရတဲ့ စားၾကြင္း (Z mod 9) နဲ႕ တူပါတယ္ (9 ခုၾကြင္း သက္ေသျပခ်က္တြင္ သက္ေသျပၿပီး)။ ဥပမာ၊ 834 ကုိ ေပါင္းၾကည့္မယ္ဆုိရင္ 8 + 3 + 4 = 15; 1 + 5 = 6 ရၿပီးေတာ့ 834 ကုိ 9 နဲ႕ စားမယ္ဆုိရင္ (စားလဒ္က 92) စားၾကြင္းက 6 ရပါမယ္။ ဒါေၾကာင့္ f(Z) = Z mod 9.

X = 9a + b ၊ Y = 9c + d ျဖစ္ပါေစ။

XY = (9a + b)(9c + d)

ညီမွ်ျခင္း၏ လက္ယာဘက္ျခမ္းမွာ …

f(XY) = f((9a + b)(9c + d))

= f(81ac + 9ad + 9bc + bd)

= (81ac + 9ad + 9bc + bd) mod 9

သုိ႕ေသာ္ 81ac mod 9 = 0; 9ad mod 9 = 0; 9bc mod 9 = 0 ျဖစ္သျဖင့္

f(XY) = (81ac + 9ad + 9bc + bd) mod 9 = bd mod 9

ညီမွ်ျခင္း၏ လက္၀ဲဘက္ျခမ္းမွာ …

f(f(X).f(Y)) = f(f(9a + b).f(9c + d))

= f(bd) = bd mod 9

ညီမွ်ျခင္း၏ လက္၀ဲဘက္ျခမ္းႏွင့္ လက္ယာဘက္ျခမ္းတုိ႕ တူညီၾကသျဖင့္ f(XY) = f(f(X).f(Y)) ျဖစ္ပါသည္။

အေျဖမွန္ အျမန္ေရြး၊ ပညာသင္ဆု ဘယ္မေ၀း ၁

လာၿပီ။ ေမးခြန္း ...

၅၆ ၇၈၃၉ × ၈၃ ၆၄၈၃ =

(က) ၄၃၈၈ ၅၄၂၀ ၉၈၄၇

(ခ) ၅၀၇၈ ၉၈၇၃ ၄၉၈၃

(ဂ) ၄၇၄၉ ၈၇၆၇ ၀၂၃၇

(ဃ) ၃၇၈၂ ၃၉၉၉ ၈၇၂၃

ႏုိင္ငံရပ္ျခား တကၠသိုလ္မ်ားတြင္ တက္ေရာက္ ပညာသင္ၾကားရန္ႏွင့္ ပညာသင္ဆု ေလွ်ာက္ထားရန္အတြက္ လုိအပ္တတ္ေသာ (SAT ကဲ့သုိ႕ေသာ စာေမးပြဲမ်ား၏) သခ်ၤာစာေမးပြဲ ေမးခြန္းလႊာမ်ားတြင္ ဤကဲ့သုိ႕ေမးခြန္းမ်ိဳး ပါေလ့ရွိသည္။ ဂဏန္းတြက္စက္ အသံုးျပဳခြင့္ေပးေသာ္လည္း အခ်ိန္ အကန္႕အသတ္ရွိတတ္ေသာ ထုိစာေမးပြဲမ်ားတြင္ ပုစၦာတစ္ပုဒ္အတြက္ ပ်မ္းမွ် မိနစ္၀က္ခန္႕သာ အခ်ိန္ရရာ ယခုကဲ့သုိ႕ေသာ ပုစၦာမ်ိဳးကို ဂဏန္းတြက္စက္ျဖင့္ အေျဖရွာပါက အခ်ိန္မမီပဲ ျဖစ္တတ္ေလသည္။

အမွန္မွာ ဤကဲ့သုိ႕ေသာ ပုစၦာမ်ိဳးကုိ ေျဖဆုိရန္အတြက္ အေျဖရေအာင္ တြက္ထုတ္ရန္ အေရးမႀကီးပါ။ ေပးထားေသာ အေျဖ ၄ ခုအနက္ အေျဖမွန္ ၁ ခုကုိသာ ေရြးထုတ္ႏုိင္ရန္ အေရးႀကီးသျဖင့္ ျဖတ္လမ္းနည္းမ်ားျဖင့္ ဤပုစၦာကုိ ေျဖရွင္းႏုိင္ရန္ ႀကိဳးစားႏုိင္ပါသည္။

ျဖတ္လမ္းနည္း (၁) အနီးဆံုးယူၿပီး တြက္ရန္

၅၆ ၇၈၃၉ ကုိ ၅၀ ၀၀၀၀၊ ၈၃ ၆၄၈၃ ကုိ ၈၀ ၀၀၀၀ ဟု အနီးဆံုး ယူလုိက္မည္။ ၄င္းတုိ႕ ၂ လံုးမွာ ေနာက္တြင္ သုညမ်ားပါသျဖင့္ ေျမွာက္ရလြယ္ပါသည္။ ၅ ကုိ ၈ ႏွင့္ ေျမွာက္လုိက္ရာ ၄၀ ဟု ထြက္လာသည္။ ၅၀ ၀၀၀၀ တြင္ သုည ၅ လံုး၊ ၈၀ ၀၀၀၀ တြင္ သုည ၅ လံုး၊ ေပါင္း ၁၀ လံုးပါသျဖင့္ အေျဖမွန္သည္ ၄၀၀၀ ၀၀၀၀ ၀၀၀၀ (၄၀ ေနာက္တြင္ သုည ၁၀ လံုးျဖည့္ထားေသာ ဂဏန္း) ထက္မနည္းေၾကာင္း ခန္႕မွန္းႏုိင္သည္။ သုိ႕ျဖစ္၍ (က)၊ (ခ) ႏွင့္ (ဂ) တစ္ခုခုသည္ အေျဖမွန္ျဖစ္သည္။ မွားလွ်င္ အမွတ္ႏႈတ္တတ္ေသာ စာေမးပြဲျဖစ္ပါက (SAT တြင္ Minus System ပါမပါ မေသခ်ာပါ) နံၾကားေထာက္ျဖည့္လွ်င္ ရွိသမွ် အမွတ္ကုန္သြားႏုိင္ရာ သိပ္မနိပ္ေသာ နည္းလမ္းျဖစ္သည္။

ဤေနရာတြင္ တစ္ခု သတိျပဳရန္မွာ အနီးဆံုးယူတာ ပုိမုိတိက်လွ်င္ အေျဖမွားမ်ားကုိ ဖယ္ထုတ္ႏိုင္စြမ္း ပုိေကာင္းလာမည္ျဖစ္သည္။ အထက္ပါ ဥပမာတြင္ ၅၆ ၇၈၃၉ ကုိ ၅၆ ၀၀၀၀၊ ၈၃ ၆၄၈၃ ကုိ ၈၃ ၀၀၀၀ ဟု အနီးဆံုး ယူလုိက္မည္ဆုိပါက အေျဖမွန္သည္ ၄၆၄၈ ၀၀၀၀ ၀၀၀၀ ထက္မနည္းဟု ခန္႕မွန္းႏုိင္မည္ျဖစ္ၿပီး ျဖစ္ႏုိင္သည့္ အေျဖမွန္ ၂ ခု (ခ ႏွင့္ ဂ) သာ က်န္ေနမည္ျဖစ္သည္။ တြက္ခ်က္မႈအတြက္ ၾကာျမင့္ခ်ိန္ အနည္းငယ္ တုိးလာေသာ္လည္း ရမ္းေျဖလုိက္ပါက ျဖစ္တန္စြမ္းသီ၀ရီ အရၾကည့္လွ်င္ မေျဖတတ္သျဖင့္ ဘဲဥကုိက္ရန္ ေသခ်ာေနေသာ ပုစၦာ ၂ ပုဒ္တုိင္းတြင္ ၁ ပုဒ္ မွန္မွာ ေသခ်ာသျဖင့္ (မွားလွ်င္ ႏႈတ္ေသာအမွတ္သည္ မွန္လွ်င္ေပးေသာ အမွတ္ထက္ နည္းေနပါက) သိပ္မဆုိးလွေသာ နည္းလမ္းျဖစ္သည္။

ျဖတ္လမ္းနည္း (၂) ေနရာလုိက္တန္ဖုိး၏ ဂုဏ္သတၱိကုိ အသံုးခ်ရန္

ဒုတိယနည္းလမ္းမွာ ေနရာလုိက္တန္ဖုိး၏ ဂုဏ္သတၱိကုိ အသံုးခ်ရန္ျဖစ္သည္။ မည္မွ်ႀကီးေသာ ကိန္းမ်ားကို ေျမွာက္ေျမွာက္ ရလဒ္၏ ခုေနရာရွိ ဂဏန္းမွာ မူလကိန္း ၂ လံုး၏ ခုေနရာရွိ ဂဏန္း ၂ လံုး ေျမွာက္လဒ္သာလွ်င္ ျဖစ္သည္။ (ဆယ္ဂဏန္းမွစ၍ ဂဏန္းမ်ား ခ်ေပါင္းရန္ လုိပါမည္။) ယခု ဥပမာတြင္ ၅၆ ၇၈၃၉ ၏ ခုေနရာရွိ ဂဏန္းမွာ ၉၊ ၈၃ ၆၄၈၃ ၏ ခုေနရာရွိ ဂဏန္းမွာ ၃ ျဖစ္ရာ ၄င္းတုိ႕ ေျမွာက္လဒ္၏ ခုေနရာရွိ ဂဏန္းမွာ (၉ × ၃ = ၂၇ ျဖစ္သျဖင့္) ၇ သာလွ်င္ ျဖစ္ရမည္၊ တနည္းအားျဖင့္ အေျဖမွန္သည္ ၇ ႏွင့္ ဆံုးရမည္။ ၇ ႏွင့္ ဆံုးေသာ အေျဖမွာ (က) ႏွင့္ (ဂ) သာရွိရာ အထက္ပါ နည္းလမ္းႏွင့္ ပူးတြဲစဥ္းစားပါက အေျဖမွန္သည္ (ဂ) ဟု ထင္ထင္ရွားရွား ထြက္လာေတာ့သည္။

ျဖတ္လမ္းနည္း (၃) အစားသီ၀ရီႏွင့္ ၉ ၾကြင္းရွာနည္းကုိ ေပါင္းစပ္ အသံုးျပဳျခင္း

အင္မတန္မွ ရက္စက္တတ္တဲ့ ေမးခြန္းထုတ္သူဟာ အေျဖအားလံုးကုိ ၄၆၄၈ နဲ႕စၿပီး ၇ နဲ႕ အဆံုးသတ္ထားပါလိမ့္မယ္။ ဘာလုိ႕လဲဆုိေတာ့ ဒီေမးခြန္းရဲ႕ အဓိက ဦးတည္ခ်က္ဟာ ဂဏန္းေျမွာက္တတ္/မတတ္ကုိ စစ္ေဆးဖုိ႕ မဟုတ္ပဲ ေျဖဆုိသူဟာ သခ်ၤာ ဂုဏ္သတၱိမ်ားကို က်င္က်င္လည္လည္ လွည့္ပတ္ အသံုးျပဳႏုိင္ျခင္း ရွိ/မရွိ စစ္ေဆးဖုိ႕ ျဖစ္ေနတာေၾကာင့္ပါပဲ။ ဒီေနရာမွာ ေနာက္တမ်ိဳး စမ္းၾကည့္သင့္တာကေတာ့ အစားသီ၀ရီနဲ႕ ၉ ၾကြင္းရွာနည္းတုိ႕ပဲ ျဖစ္ပါတယ္။

နာမည္ကုိ ဖတ္ၿပီး လန္႕မသြားပါနဲ႕ေလ။ နည္းလမ္းက လြယ္လြယ္ေလးပါ။

ပထမဆံုး ၅၆ ၇၈၃၉ နဲ႕ ၈၃ ၆၄၈၃ တုိ႕ကုိ တစ္လံုးတည္းျဖစ္ေအာင္ ေပါင္းပါ။ (ေနာက္တနည္း - ၉ ျပည့္ေအာင္ တြဲတြဲၿပီး က်န္တာေလးေတြ ေပါင္းလဲ ရတယ္။)

၅ + ၆ + ၇ + ၈ + ၃ + ၉ = ၃၈

၃ + ၈ = ၁၁

၁ + ၁ = ၂

၈ + ၃ + ၆ + ၄ + ၈ + ၃ = ၃၂

၃ + ၂ = ၅

ေနာက္ၿပီး အဲဒီ ေပါင္းလဒ္ ၂ ခုကို ေျမွာက္ပါ

၂ × ၅ = ၁၀

ရလဒ္ကုိ တစ္လံုးထည္းျဖစ္ေအာင္ ထပ္ေပါင္းပါဦး။

၁ + ၀ = ၁

အေျဖေတြကုိလဲ တစ္လံုးတည္းျဖစ္ေအာင္ ေပါင္းၾကည့္ပါ။

(က) ၄၃၈၈ ၅၄၂၀ ၉၈၄၇ ကုိ ေပါင္းေတာ့ ၈ ရတယ္။

(ခ) ၅၀၇၈ ၉၈၇၃ ၄၉၈၃ ကုိ ေပါင္းေတာ့ ၈ ရတယ္။

(ဂ) ၄၇၄၉ ၈၇၆၇ ၀၂၃၇ ကုိ ေပါင္းေတာ့ ၁ ရတယ္။

(ဃ) ၃၇၈၂ ၃၉၉၉ ၈၇၂၃ ကုိ ေပါင္းေတာ့ ၇ ရတယ္။

ေစာေစာက ေျမွာက္ၿပီး ေပါင္းထားတဲ့ (၂ × ၅ = ၁၀၊ ၁ + ၀ = ၁) ၁ နဲ႕တူတဲ့ (ဂ) ကိုေရြးလုိက္ရံုပါပဲ။

နည္းလမ္းပဲ သိခ်င္သူမ်ား ဒီေနရာမွာတင္ ရပ္ႏုိင္ပါၿပီ။ သက္ေသျပခ်က္ကုိ သိခ်င္သူမ်ား၊ ဒီလုိ ေပါင္းလုိက္ ေျမွာက္လုိက္ရံုနဲ႕ အေျဖမွန္ တုိက္စစ္တာ အၿမဲမွန္ေနပါ့မလား၊ စာေမးပြဲေနာ္ ေပါ့ပ်က္ပ်က္ မလုပ္နဲ႕လုိ႕ ဆုိခ်င္သူမ်ား သက္ေသျပခ်က္ကုိ အေျဖမွန္ အျမန္ေရြး၊ ပညာသင္ဆု ဘယ္မေ၀း အပုိင္း ၂ တြင္ ဆက္ဖတ္ပါ။

9 ခုၾကြင္း သက္ေသျပခ်က္

ကိန္းျပည့္တစ္လံုး (ဥပမာ 837) ကုိ 9 ႏွင့္ စား၍ ျပတ္/မျပတ္ သိႏုိင္ရန္အတြက္ တကယ္ စားၾကည့္ရန္ မလုိအပ္ပဲ ၄င္း ကိန္းျပည့္တြင္ ပါ၀င္ေသာ ဂဏန္းမ်ား၏ ပကတိတန္ဖုိးမ်ား ေပါင္းလဒ္ကုိ 9 ႏွင့္ စားလုိ႕ ျပတ္/မျပတ္ စစ္ေဆးျခင္းျဖင့္ သိႏုိင္ေၾကာင္း (ဥပမာ 8 + 3 + 7 = 18 ျဖစ္ရာ 837 သည္ 9 ႏွင့္စား၍ ျပတ္သည္) အေျခခံပညာတန္းတြင္ သင္ၾကား သိရွိၿပီး ျဖစ္သည္။ သုိ႕ရာတြင္ ၄င္းသီ၀ရီ မွန္ကန္ေၾကာင္း သက္ေသျပခ်က္ကုိ လူအမ်ား သိရွိမႈ နည္းပါးသျဖင့္ ေရးသား တင္ျပအပ္ပါသည္။

သက္ေသျပရန္။

ေပးထားေသာ ကိန္းျပည့္တစ္ခု Z = z0 × 100 + z1 × 101 + z2 × 102 + … + zn × 10n အတြက္

မွီခ်က္ f(Z) = f(z0 + z1 + z2 + … + zn) if z0 + z1 + z2 + … + zn > 9;

f(Z) = z0 + z1 + z2 + … + zn otherwise ျဖစ္ပါေစ။ Z mod 9 = f(Z) ျဖစ္ေၾကာင္း သက္ေသျပပါ။

သက္ေသျပခ်က္။

အစားသီ၀ရီ (Theory of Division a.k.a Procedure of Division) အရ မည္သည့္ကိန္းျပည့္ Z ကုိမဆုိ Z = pq + r ပံုစံျဖင့္ ေဖၚျပႏုိင္ပါသည္ (Z၊ p၊ q ႏွင့္ r တုိ႕သည္ ကိန္းျပည့္မ်ားျဖစ္၍ r သည္ q ထက္အၿမဲငယ္သည္)။ ဤေနရာတြင္ q = 9 ျဖစ္လွ်င္ မည္သည့္ကိန္းျပည့္ Z ကုိမဆုိ Z = 9p + r အျဖစ္ ေျပာင္းေရးႏုိင္သည္။ (၄င္း p နဲ႕ r တုိ႕သည္ Z ကုိ q ႏွင့္ စားလုိ႕ရသည့္ စားလဒ္နဲ႕ စားၾကြင္းျဖစ္ၿပီး r သည္ 9 ထက္ အၿမဲငယ္ေၾကာင္း သတိျပဳပါ။) ထုိ႕ေၾကာင့္ ကိန္းျပည့္ Z = 9p + r တုိင္းကုိ 9 ႏွင့္ စားလွ်င္ p ရၿပီး r ၾကြင္းသည္။

မည္သည့္ အေပါင္းကိန္းျပည့္ k အတြက္မဆုိ 10k = 9 × 100 + 9 × 101 + … + 9 * 10k-1 + 1 ျဖစ္သည္။ 9 ကုိ ဘံုထုတ္လွ်င္ 10k = 9(100 + 101 + … + 10k-1) + 1 ဟုရလာမည္။

မွီခ်က္ g(0) = 0; g(k) = 100 + 101 + … + 10k-1 ျဖစ္ပါေစ။ 10k = 9g(k) + 1 ျဖစ္မည္။

Z = z0 × 100 + z1 × 101 + z2 × 102 + … + zn × 10n

= z0 (9g(0) + 1) + z1 × (9g(1) + 1)
+ z2 × (9g(2) + 1) + … + zn × (9g(n) + 1)

= 9g(0)z0 + z0 + 9g(1)z1 + z1
+ 9g(2)z2 + z2 + … + 9g(n)zn + zn

= 9 (g(0)z0 + 9g(1)z1 + 9g(2)z2 + … + 9g(n)zn) + z0 + z1
+ z2 + … + zn

z' = z0 + z1
+ z2 + … + zn ျဖစ္ပါေစ။

ကိန္းျပည့္ Z ကုိ 9 ႏွင့္ စားလွ်င္ ရသည့္ စားၾကြင္းႏွင့္ z' ကုိ 9 ႏွင့္စားရင္ ရသည့္ စားၾကြင္းတုိ႕ အတူတူပဲ ျဖစ္ပါသည္။ တနည္းအားျဖင့္ z' သည္ 9 ထက္ငယ္ပါက Z ကုိ 9 ႏွင့္စားလွ်င္ ရတဲ့ စားၾကြင္း Z mod 9 = z' ျဖစ္ၿပီး z' သည္ 9 ထက္ မငယ္ရင္ေတာ့ Z mod 9 = z' mod 9 ျဖစ္သည္။ မည္သုိ႕ပင္ျဖစ္ေစ z' သည္ Z ထက္ ငယ္ကုိငယ္သည္။ အဘယ္ေၾကာင့္ဆုိေသာ္ ခုဂဏန္း n လံုးေပါင္းျခင္းသည္ 9n ထက္ ပုိမႀကီးႏုိင္ပဲ 9n သည္ 10n ထက္ ငယ္ကုိငယ္ေသာေၾကာင့္ (အေပါင္းကိန္းျပည့္ n တုိင္းအတြက္ 10n သည္ 10n ထက္မငယ္လွ်င္ပင္ တူေနသည္) ျဖစ္သည္။

ထုိ႕ေၾကာင့္ ကိန္းျပည့္ Z ကုိ 9 ျဖင့္စားလွ်င္ ရမည့္ စားၾကြင္း = Z mod 9 = h(Z) = z' if z' < 9; h(z') otherwise; ဟူ၍ တပတ္လည္ မွီခ်က္ recursive function hကုိ အသံုးျပဳကာ စားၾကြင္း Z mod 9 ကုိရွာျခင္းသည္ တခ်ိန္ခ်ိန္တြင္ စုဆံု (converge) မည္မွာ မုခ်ျဖစ္ေၾကာင္း သိႏုိင္သည္။

သုိ႕ရာတြင္ မွီခ်က္ h= f ပင္ ျဖစ္သျဖင့္ f(Z) = Z mod 9 ျဖစ္ပါသည္။

Saturday, August 15, 2009

ေရွးထံုးလဲ ပယ္မွ

Dilbert.com

အင္ဂ်င္ႏုယဥ္က ေဒၚလာသန္းေပါင္းမ်ားစြာတန္တဲ့ နည္းပညာကုိ ကုမၸဏီအတြက္ ဖန္တီးတီထြင္ေပးတာေတာင္မွ အကာနဲ႕အႏွစ္ခြဲျခား မသိေလာက္ေအာင္ တံုးအၿပီး ည့ံဖ်င္းတဲ့ မန္ေနဂ်ာက အ၀တ္အစား နည္းနည္းေလး ေတာက္ေျပာင္ေနတာကုိပဲ အျပစ္ေျပာေနတဲ့အတြက္ ပညာရွင္ (အင္ဂ်င္ႏုယဥ္) က စိတ္ေပါက္ေပါက္နဲ႕ ေဆာ္ပေလာ္တီးပစ္လုိက္တာပဲ ျဖစ္ပါတယ္။

လူမႈေရး၊ စီးပြားေရး အဖြဲ႕အစည္းေတြမွာ အဓိက ဦးတည္ခ်က္က သက္ဆုိင္ရာ အဖြဲ႕အစည္း စည္ပင္ရွင္သန္ တုိးတက္ေရးပဲ ျဖစ္ပါတယ္။ အဲဒီ တုိးတက္မႈကို သက္ဆုိင္ရာ နယ္ပယ္အသီးသီးရဲ႕ ပညာရွင္ေတြကပဲ ေဆာင္ၾကဥ္းေပးႏုိင္ပါတယ္။ ဟယ္ ... ပညာရွင္က ေရွးထံုးေတြကုိ မလုိက္နာလုိ႕၊ ပညာရွင္က ယဥ္ေက်းမႈနဲ႕ ေလ်ာ္ညီေအာင္ မ၀တ္ဆင္လုိ႕၊ ပညာရွင္က ဘာျဖစ္လုိ႕၊ ညာျဖစ္လုိ႕ဆုိတဲ့ လုပ္ငန္းနဲ႕ မဆုိင္တဲ့ အေၾကာင္းေတြျပၿပီး ပညာရွင္ကုိ အဖြဲ႕အစည္း အတြင္းက ကန္ထုတ္ရင္ အဲဒီ အဖြဲ႕အစည္းပဲ မတုိးတက္ပဲ ေခတ္ေနာက္က် ေအာက္က်ေနာက္က် ျဖစ္က်န္ခဲ့မွာပါ။

ဒါေၾကာင့္ ေရွးထံုးလဲ (ပယ္ဖုိ႕လုိလာရင္) ပယ္မွ။

Thursday, August 13, 2009

ပေရာဟိတ္ႏွင့္ ေဟာကိန္း

ေရွးတုန္းက ရွင္ဘုရင္ေတြက ဥာဏ္အေျမာ္အျမင္ႀကီးသူေတြ၊ အသက္အရြယ္ႀကီးလုိ႕ အေတြ႕အႀကံဳ ရင့္က်က္သူေတြ၊ ေရွ႕ျဖစ္ေနာက္ျဖစ္ (ကိုတနည္းနည္းနဲ႕) ေဟာေျပာႏုိင္သူေတြကုိ ပေရာဟိတ္ေတြအျဖစ္ ခန္႕အပ္ထားၿပီး အႀကံဥာဏ္ေတြ ရယူခဲ့ပါတယ္။ အနာဂါတ္ကုိ ေျမာ္ျမင္ႏုိင္မႈ၊ မွန္ကန္စြာ ေဟာကိန္းထုတ္ႏုိင္မႈေတြဟာ ႏုိင္ငံေရး၊ စီးပြားေရးနဲ႕ စစ္မက္ေရးရာေတြမွာ အရႈံးအႏုိင္ကုိ မၾကာခဏ ဆံုးျဖတ္ေပးသြားတတ္ပါတယ္။ 

၂၀၀၉ ခု မတ္လအတြင္းက ခုိးကူးျပႆနာ က်ယ္က်ယ္ေလာင္ေလာင္ ျဖစ္လာတာနဲ႕ ပတ္သက္ၿပီး DJ Wine နဲ႕ DJ Khun တုိ႕နဲ႕ စာေရးသူ အလြတ္သေဘာ ေဆြးေႏြးရာမွာ ခုိးကူးကုိ ျပႆနာအျဖစ္ မျမင္ပဲ အခြင့္အလမ္းသစ္တစ္ရပ္အျဖစ္ ျမင္ႏုိင္ဖုိ႕၊ ယခင္က သံုးစြဲခဲ့တဲ့ ကာဗာကဒ္စနစ္ကို သံုးစြဲဖုိ႕ ေ၀ဖန္ အႀကံျပဳခဲ့ပါတယ္။ ဒီသေဘာတရားကုိ ဂီတအစည္းအရံုးထံ DJ Wine က ထပ္ဆင့္ တင္ျပေပးမယ္ေျပာလုိ႕ ေဆြးေႏြးမႈ မွတ္တမ္းအက်ဥ္းခ်ဳပ္ကုိ လွ်ပ္စစ္စာလႊာနဲ႕ DJ Wine၊ DJ Khun နဲ႕ ေလာကအလွမဂၢဇင္းတုိ႕ကုိ ေပးပုိ႕ခဲ့ရာ (DJ Wine က ဂီတအစည္းအရံုးကုိ တင္ျပ၊ မျပ မသိေသာ္လည္း) ေလာကအလွမဂၢဇင္းက ခုိးကူးဟာ ဂီတပညာရွင္ လက္သစ္ေတြအတြက္ မဟာအခြင့္အလမ္း အမည္ရွိေဆာင္းပါးနဲ႕ အင္တာနက္ စာမ်က္ႏွာေပၚကုိ တင္ျပေပးခဲ့ပါတယ္။

ဒီေန႕ သတင္းေတြ ေလွ်ာက္လွန္ၾကည့္ေတာ့ ေလးျဖဴရဲ႕ ဘဂၤလားပင္လယ္ေအာ္ VCD ကုိ ကာဗာကဒ္စနစ္နဲ႕ ျဖန္႕ခ်ိတယ္လုိ႕ ၾကားသိရတာမုိ႕ ေဟာကိန္းမွန္တဲ့ ပေရာဟိတ္လုိပဲ ပီတိျဖစ္ရပါေၾကာင္းနဲ႕ ဒီထက္ ပုိမုိ ႀကီးက်ယ္တဲ့ ျပႆနာ၊ အရႈပ္အေထြး၊ လမ္းေၾကာင္းေတြကိုလဲ ေဟာကိန္းမွန္မွန္ ထုတ္ႏုိင္ဖုိ႕ ႀကိဳးစားသင့္တယ္လုိ႕ ေတြးမိေၾကာင္း ဥဒါန္းက်ဴးလုိက္ရပါတယ္ ...

Sunday, August 9, 2009

Quick Sort ကုိ အသံုးျပဳၿပီး Sorting စီျခင္း

ေလာကအလွ အြန္လုိင္းမဂၢဇင္းတြင္ ေဖာ္ျပခဲ့ဖူးေသာ ေဆာင္းပါးကုိ ျပန္လည္ေဖာ္ျပျခင္း ျဖစ္ပါသည္။

ကြန္ပ်ဴတာ သိပၸံ (Computer Science) ေလ့လာသူေတြနဲ႕ သတင္းနည္းပညာ (IT) ေလ့လာသူေတြအတြက္ အစီအစဥ္ဆြဲနည္း (Programming) သင္ခန္းစာေတြမွာ မပါမျဖစ္ကေတာ့ အခ်က္အလက္မ်ားကုိ စီျခင္း (Sorting) အစီအစဥ္ပါပဲ။ Sorting စီတဲ့ နည္းလမ္းစဥ္ (Algorithm) အမ်ိဳးေပါင္း ေျမာက္မ်ားစြာ ရွိတဲ့အထဲက Bubble Sort, Counting Sort, Insertion Sort, Selection Sort နဲ႕ Quick Sort တုိ႕ဟာ ထင္ရွားပါတယ္။ (စာေရးသူ အႀကိဳက္ဆံုးကေတာ့ Selection Sort ျဖစ္ၿပီး အေၾကာင္းရင္းကေတာ့ နားလည္ရလြယ္လြန္းလုိ႕ ျဖစ္ပါတယ္။) ဒါေပမဲ့ လက္ေတြ႕ဘ၀မွာ အသံုး၀င္တာကေတာ့ နားလည္ရခက္၊ ေရးရတာ လက္၀င္တဲ့ Quick Sort ေလ။ ေရးလုိက္ၾကတဲ့ အစီအစဥ္ေတြတုိင္းမွာ စီစရာ (object, data type) တစ္မ်ိဳး ေပၚလာတုိင္း Quick Sort ကုိ တစ္ခါ ထထ ေရးရမယ္ ဆုိတာကေတာ့ လြန္လြန္းပါတယ္။ ဒါေၾကာင့္ C/C++ စံသတ္မွတ္ခ်က္မွာ Array အားလံုးကို စီႏုိင္ဖုိ႕ qsort ဆုိတဲ့ function ပါေနတာ ျဖစ္ပါတယ္။ ဒီေဆာင္းပါးမွာ အဲဒီ qsort ကုိ အသံုးျပဳနည္းကို ေရးသားေပးမွာ ျဖစ္ပါတယ္။

qsort ရဲ႕ သတ္မွတ္ခ်က္မွာ အစီအစဥ္ေရးသားသူ (programmer) ဒါမွမဟုတ္ ကုဒ္ဒါကို ၿခိမ္းေျခာက္ေနတာကေတာ့ pointer ေတြပါပဲ။ ရုိးရုိး Data Pointer ေတြတင္မကပဲ Function Pointer ႀကီးပါ ပါေနေတာ့ Pointer ဆုိရင္ ေက်ာစိမ့္ေနၾကလူေတြ လန္႕ကုန္တာ မဆန္းပါဘူး။ ဒါေပမဲ့ အေက်ာသိရင္ လြယ္လြယ္ကေလးပါ။ qsort ရဲ႕ အဓိပၸါယ္ သတ္မွတ္ခ်က္ကို အရင္ၾကည့္ရေအာင္ေနာ္။

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

ပထမဆံုး return type ကေတာ့ ဒီ function ဟာ return မျပန္ပါဘူးလုိ႕ အဓိပၸါယ္ရပါတယ္။ ဆုိလုိတာက ေပးလိုက္တဲ့ array ကုိ စီပဲ စီေပးမယ္။ ဘာ ဂဏန္းမွ တြက္ၿပီး အေျဖမထုတ္ေပးပါဘူးေပါ့။

ပထမဆံုး parameter က စီရမဲ့ array ရဲ႕ ပထမဆံုးအကြက္ရဲ႕ လိပ္စာ (address) ပါ။ အမ်ားေၾကာက္တဲ့ pointer ေပါ့။ Array အားလံုးဟာ Fix Pointer ေတြ ျဖစ္တဲ့အတြက္ စိတ္ခ်လက္ခ်ပဲ array name ကုိ ျဖည့္လုိက္လုိ႕ရပါတယ္။

ဒုတိယ parameter ကေတာ့ Array ရဲ႕ အရြယ္အစား (size) ျဖစ္ပါတယ္။ C/C++ မွာ Array ရဲ႕ size ကုိ compile-time/run-time check မလုပ္ပဲ ကုဒ္ဒါကပဲ အၿမဲ ကုိင္တြယ္ ႀကီးၾကပ္ရတာမုိ႕ ဒါကို ထည့္ေပးရတာပါ။ ႏုိ႕မုိ႕ရင္ ဘယ္ႏွခု စီရမလဲ မသိပဲ ျဖစ္ေနမယ္ေလ။ ကုိယ့္ Array မွာ Element ၁၀ ခုပါရင္ 10 လုိ႕ထည့္ေပါ့။ Variable တစ္ခုခု ထည့္လုိ႕လဲ ရပါတယ္။

တတိယ parameter ကေတာ့ စီခ်င္တဲ့ Array Element တစ္ခုခ်င္းရဲ႕ အရြယ္အစားေပါ့။ အဲဒါမွ အဲဒီ မွတ္ဥာဏ္တံုးႀကီး (memory block) ေတြကို ေရႊ႕လုိ႕ရမယ္ေလ။ ဒါလဲ မခက္ပါဘူး။ sizeof(element) လုိ႕ ေပးလုိက္ရင္ရပါတယ္။

စတုတၳနဲ႕ ေနာက္ဆံုး parameter ကေတာ့ နည္းနည္း ရွင္းျပရ လက္၀င္ပါတယ္။ ဒါဟာ Function Pointer ႀကီးျဖစ္ပါတယ္။ ကုိယ့္ဘာသာကုိယ္ သတ္မွတ္ထားတဲ့ Element ေတြကို ႏိႈင္းယွဥ္ခ်င္ရင္ ဒီ Function နဲ႕ တြက္ဆုိၿပီး ေျပာရတဲ့ သေဘာပါ။ (ေနာက္တမ်ိဳးေျပာရရင္ အဲဒီ Function ႀကီးကုိ qsort ကေန လွမ္းေခၚမွာ ျဖစ္ပါတယ္။ အဲဒီ Function ႀကီးက qsort ဆီကုိ ေရွ႕ကေကာင္က ငယ္ရင္ အႏႈတ္ကိန္း၊ တူရင္ သုည၊ ႀကီးရင္ အေပါင္းကိန္း တစ္ခုခု return ျပန္ရပါမယ္။) အဲဒီ Function ႀကီးရဲ႕ ပံုစံကလဲ

int function_name(const void* a, const void* b);

ပဲျဖစ္ရပါမယ္။ ပုိနားလည္လြယ္ေအာင္ ဥပမာေလးနဲ႕ ၾကည့္ရေအာင္ေနာ္။

ဥပမာ ၀န္ထမ္းေတြကို လစာ အမ်ားဆံုးကေန အနည္းဆံုးကို စီၿပီးသား အစီရင္ခံစာထုတ္ေပးတဲ့ အစီအစဥ္ကုိ လုိခ်င္တယ္။ တကယ္လုိ႕ လစာတူေနရင္ လုပ္သက္ရင့္တဲ့လူကုိ ေရွ႕မွာ ထားခ်င္တယ္ ဆုိပါစုိ႕။ ဒါဆုိရင္ ၀န္ထမ္းေတြရဲ႕ အခ်က္အလက္ေတြကုိ သိမ္းဖုိ႕ class တစ္ခု ေဆာက္ရပါမယ္။

class employee{

    int experience;     //in year

    float salary;    //in kyat

    /* Blar Blar Blar */

    public:

        bool operator < (employee &e)    {

            If(this->salary == e.salary) return (this->experience < e.experience);

            else return (this->salary < e.salary);

        }

        void my_emp_function(void) { }

        /* More Blar Blar Blar */

};

ေပါ့။ အဲဒီ Class မွာ လစာရယ္၊ လုပ္သက္ရယ္က Private Member ေတြ ျဖစ္ၿပီးေတာ့ အျပင္ကေန ၀န္ထမ္းေတြကို ႏိႈင္းယွဥ္ႏုိင္ဖုိ႕ operator '<' ကုိ overload လုပ္ထားတဲ့ Function တစ္ခုပါပါတယ္။ ဒါေပမဲ့ qsort ထဲကုိ အဲဒီ function ကုိ ထည့္လုိက္လုိ႕မရတဲ့အတြက္ (qsort က လုိခ်င္တဲ့ ပံုစံနဲ႕ operator '<' ရဲ႕ ပံုစံ Syntax မတူတဲ့အတြက္) qsort အတြက္ Function ကုိ ဒီလိုေရးရပါမယ္။

int employee_comparer(const void* a, const void* b) {

    employee *temp_e = (employee*) a;        //type cast from void*

    employee *temp_f = (employee*) b;        //to employee*

    if((*temp_e) < (*temp_f)) return -1;

        else return 1;    

}

ေရးထားတဲ့ Function ရဲ႕ ပထမ ၂ ေၾကာင္းကေတာ့ ဘာ type information မွမပါပဲ qsort က ရမ္းသန္းမွန္းသန္း ပုိ႕လႊြတ္လုိက္တဲ့ Pointer ၂ ခုကို employee Pointer ျဖစ္ေအာင္ ေျပာင္းယူတာပါ။ အဲဒီမွာ တခ်က္သတိထားဖုိ႕က အဲဒီလုိ ေျပာင္းယူၿပီးတာေတာင္ temp_e နဲ႕ temp_f က Pointer ပဲ ရွိပါေသးတယ္။ ဒါေၾကာင့္ သူတုိ႕ကုိ သံုးတဲ့အခါမွာ Data of လုိ႕ အဓိပၸါယ္ရတဲ့ '*' ေလးကို အၿမဲထည့္ရပါမယ္။ (တကယ္လုိ႕ သူတို႕ထဲက function ေတြ ေခၚမယ္ဆုိရင္လဲ operator '.' ကုိ မသံုးပဲ operator '->' ကုိ ဒီလုိေလး temp_e->my_emp_function() ဆုိၿပီးေတာ့ သံုးေပးရပါမယ္။) အဲဒီ '*' ေလးကို ထည့္ၿပီး operator '>' နဲ႕ ႏိႈင္းယွဥ္လုိ႕ရလာတဲ့ အေျဖေပၚမူတည္ၿပီး -1 သုိ႕မဟုတ္ +1 ကို qsort အတြက္ return ျပန္ေပးလုိက္ရပါမယ္။

ဒီ Function ေလးေရးလုိ႕ အခ်ိဳးေျပသြားၿပီဆုိရင္ေတာ့ qsort ကုိ စိတ္ေအးခ်မ္းသာ အသံုးျပဳႏုိင္ပါၿပီ။ (employee ရဲ႕ private member ေတြကို accessor method ေတြကေနတဆင့္ ေခၚထားတာ သတိျပဳပါ။ တကယ္တမ္း ေရးတဲ့အခါက်ေတာ့ သတိလက္လြတ္ ဒီတုိင္း ေရးမိတတ္ပါတယ္။ အဲဒီလုိေရးခ်င္ရင္ေတာ့လဲ friend လုပ္လုိက္ေပါ့ဗ်ာ၊ ေနာ။) ေအာက္မွာက main Function ပါ။

/* preprocessor Yada Yada Yada */

void main(void)

{

    employee myEmployeeArray[NUM_OF_EMPLOYEE];

    /* input data into myEmployeeArray */

    qsort(myEmployeeArray, NUM_OF_EMPLOYEE, sizeof(employee), employee_comparer);

    /* output sorted myEmployeeArray */

}

qsort ကုိ လြယ္လြယ္ေခၚၿပီး ကုဒ္ဒါအေပါင္း သက္သာၾကပါေစေၾကာင္း …

စာေရးသူ ေရးသားစမ္းသပ္ထားေသာ Code ကုိ ရယူရန္