قسم البرمجة الوظيفية وهندسة الخوارزميات
الخوارزمي:
الخوارزمي هو محمد بن موسى الخوارزمي المكنى بأبي جعفر, نبغ في حدود عام 205هـ.و عاصر الخلفية المأمون العباسي الذي أدرك فضل هذا العالم العربي, و اتساع آفاق معرفته, فأغدق عليه النعم, و أولاه براعية عظيمة. و لا يعرف تاريخ ميلاده و على وجه الدقة. (و أن كانت رواية تقول أنه ولد عام 780م و توفي عام 850) لأن أولئك العلماء لم يكون مهتمين بميلادهم, حتى يظهر نبوغهم فيحتفي بهم الجميع.
و الخوارزمي عالم عربي يزدهي به العلم في كل عصر ابد الدهر, فهو مبتدع علم الجبر, واضع أسسه, و مبتكر حساب اللوغاريتمات. و لهذا كان أهلا لتسميته يأبى الجبر.
و قد نبغ الخوارزمي في علوم الحساب و الفلك و الجغرافيا, كما برع في علوم الهيأة, و تميز بالذكاء في استنباط الحقائق, و بنفاذ البصرية عند الكلام, فكان أحد علماء العصر الإسلامي
البارزين الذين لهم الفضل, كل الفضل, في تطور العلوم الحديثة.
أهم أعماله و أقواله:
يعتبر الخوارزمي بحق مبتكر علم الجبر, و مما يدل على إمامته في هذا العلم, استخدامه التعبيرات الجبرية لأول مرة, و تكرار معادلاته الجبرية حتى يومنا هذا مثل:
س^2 + 5س = 24
و الخوارزمي أول من حل معادلات الدرجة الثانية. كما كان احد علماء الأفذاذ الذين أحاطوا بمعارف عصرهم, وبرزوا في كثير منها كالفلك و الجغرافيا و الحساب, لذلك جعله المأمن من خلصائه المقربين, كما سلفت الإشارة.
علم الجبر:
الحبر تعبير استخدمه الخوارزمي من اجل حل المعادلات بعد تكونها, و معناه أن طرفا من طرفي المعادلة يكمل و يزيد على الآخر و هو الجبر, و الأجناس المتجانسة المتساوية في الطرفين تسقط منها, و هو المقابل أي أن :
ب س + حـ = أس^2 + 2ب س – ح
و تصبح بعد الجبر ب س + 2حـ = أس^2 + 2ب س
و تصبح بالمقابلة 2 حـ = أس^2 + ب س
و اسم الجبرا Algebra في جميع لغات العالم مشتق من الكلمة العربية "الجبرا" و التي استخدمها الخوارزمي في كتابه.
و قد إشتغل العرب بالجبر و استعملوه حتى نبغوا فيه, بينما كان بمثابة الألغاز بالنسبة للأوروبيين. و من الروايات الطريفة التي ذكر في هذا الصدد , مقارعة العالم الرياضي أويلر المؤمن ديدرو مبتدع دائرة المعارف. ففي أوائل عصر النهضة وصل إلى علم ديدرو أن أويلرقد وضع برهانا رياضيا على وجود الله, فطلب منه قيصر روسيا أن ينازل أويلر بالحجة و الدليل العلمي. و أمام حشد من البلاط, و على مرأى الجميع, بادره بالعبارة الجبيرة الآتية
أ + ب ن = س
فالله موجود
فما قولك?
و كان الجبر آنذاك بمثابة الطلاسم لدى الأوروبيين, فوقف ديدرو حائرا أمام المعادلة الجبرية , ثم ولى هربا مهزوما!
حساب اللوغاريتمات:
أصل كلمة "لوغاريتم" لفظ عربي و هو الخوارزمي , ترجمه الأوروبيون إلى لوجارثم و جعلوا حسابه هو "اللوجاريثمز" ثم عرب إلى اللوغاريتمات من غير رده إلى أصله.
و اللوغاريتمات هي الحساب الذي يحول عمليات الضرب إلى الجمع.
و عمليات القسمة إلى الطرح.
و الآن مع كتاب بعنوان إتقان الخوارزميات مع C "Mastering Algorithms with C" و يمكن تحميله من الرابط التالي :
http://rapidshare.de/files/1658168/O_Reill...C-1999.rar.html
الناشر: O'Reilly
تاريخ النشر: أوت 1999
عدد الصفحات: 560
الخوارزمية هي مجموعة من الخطوات الرياضية والمنطقية والمتسلسلة اللازمة لحل مشكلة ما. وسميت الخوارزمية بهذا الاسم نسبة إلى العالم المسلم الطاشقندي الاصل أبو جعفر محمد بن موسى الخوارزمي الذي ابتكرها في القرن التاسع الميلادي. الكلمة المنتشرة في اللغات اللاتينية و الأوروبية هي «algorithm» وفي الأصل كان معناها يقتصر على خوارزمية لتراكيب ثلاثة فقط وهي: التسلسل والاختيار (selection) والتكرار.
التسلسل: تكون الخوارزمية عبارة عن مجموعة من التعليمات المتسلسلة، هذه التعليمات قد تكون إما بسيطة أو من النوعين التاليين.
الاختيار: بعض المشاكل لا يمكن حلها بتسلسل بسيط للتعليمات، وقد تحتاج إلى اختبار بعض الشروط وتنظر إلى نتيجة الاختبار، إذا كانت النتيجة صحيحة تتبع مسار يحوي تعليمات متسلسلة، وإذا كانت خاطئة تتبع مسار آخر مختلف من التعليمات. هذه الطريقة هي ما تسمى اتخاذ القرار أو الاختيار.
التكرار: عند حل بعض المشاكل لا بد من إعادة نفس تسلسل الخطوات عدد من المرات. وهذا ما يطلق عليه التكرار.
و قد أثُبت أنه لاحاجة إلى تراكيب إضافية. استخدام هذه التراكيب الثلاث يسهل فهم الخوارزمية واكتشاف الأخطاء الواردة فيها وتغييرها.
التسلسل: تكون الخوارزمية عبارة عن مجموعة من التعليمات المتسلسلة، هذه التعليمات قد تكون إما بسيطة أو من النوعين التاليين.
الاختيار: بعض المشاكل لا يمكن حلها بتسلسل بسيط للتعليمات، وقد تحتاج إلى اختبار بعض الشروط وتنظر إلى نتيجة الاختبار، إذا كانت النتيجة صحيحة تتبع مسار يحوي تعليمات متسلسلة، وإذا كانت خاطئة تتبع مسار آخر مختلف من التعليمات. هذه الطريقة هي ما تسمى اتخاذ القرار أو الاختيار.
التكرار: عند حل بعض المشاكل لا بد من إعادة نفس تسلسل الخطوات عدد من المرات. وهذا ما يطلق عليه التكرار.
و قد أثُبت أنه لاحاجة إلى تراكيب إضافية. استخدام هذه التراكيب الثلاث يسهل فهم الخوارزمية واكتشاف الأخطاء الواردة فيها وتغييرها.
الخوارزمي:
الخوارزمي هو محمد بن موسى الخوارزمي المكنى بأبي جعفر, نبغ في حدود عام 205هـ.و عاصر الخلفية المأمون العباسي الذي أدرك فضل هذا العالم العربي, و اتساع آفاق معرفته, فأغدق عليه النعم, و أولاه براعية عظيمة. و لا يعرف تاريخ ميلاده و على وجه الدقة. (و أن كانت رواية تقول أنه ولد عام 780م و توفي عام 850) لأن أولئك العلماء لم يكون مهتمين بميلادهم, حتى يظهر نبوغهم فيحتفي بهم الجميع.
و الخوارزمي عالم عربي يزدهي به العلم في كل عصر ابد الدهر, فهو مبتدع علم الجبر, واضع أسسه, و مبتكر حساب اللوغاريتمات. و لهذا كان أهلا لتسميته يأبى الجبر.
و قد نبغ الخوارزمي في علوم الحساب و الفلك و الجغرافيا, كما برع في علوم الهيأة, و تميز بالذكاء في استنباط الحقائق, و بنفاذ البصرية عند الكلام, فكان أحد علماء العصر الإسلامي
البارزين الذين لهم الفضل, كل الفضل, في تطور العلوم الحديثة.
أهم أعماله و أقواله:
يعتبر الخوارزمي بحق مبتكر علم الجبر, و مما يدل على إمامته في هذا العلم, استخدامه التعبيرات الجبرية لأول مرة, و تكرار معادلاته الجبرية حتى يومنا هذا مثل:
س^2 + 5س = 24
و الخوارزمي أول من حل معادلات الدرجة الثانية. كما كان احد علماء الأفذاذ الذين أحاطوا بمعارف عصرهم, وبرزوا في كثير منها كالفلك و الجغرافيا و الحساب, لذلك جعله المأمن من خلصائه المقربين, كما سلفت الإشارة.
علم الجبر:
الحبر تعبير استخدمه الخوارزمي من اجل حل المعادلات بعد تكونها, و معناه أن طرفا من طرفي المعادلة يكمل و يزيد على الآخر و هو الجبر, و الأجناس المتجانسة المتساوية في الطرفين تسقط منها, و هو المقابل أي أن :
ب س + حـ = أس^2 + 2ب س – ح
و تصبح بعد الجبر ب س + 2حـ = أس^2 + 2ب س
و تصبح بالمقابلة 2 حـ = أس^2 + ب س
و اسم الجبرا Algebra في جميع لغات العالم مشتق من الكلمة العربية "الجبرا" و التي استخدمها الخوارزمي في كتابه.
و قد إشتغل العرب بالجبر و استعملوه حتى نبغوا فيه, بينما كان بمثابة الألغاز بالنسبة للأوروبيين. و من الروايات الطريفة التي ذكر في هذا الصدد , مقارعة العالم الرياضي أويلر المؤمن ديدرو مبتدع دائرة المعارف. ففي أوائل عصر النهضة وصل إلى علم ديدرو أن أويلرقد وضع برهانا رياضيا على وجود الله, فطلب منه قيصر روسيا أن ينازل أويلر بالحجة و الدليل العلمي. و أمام حشد من البلاط, و على مرأى الجميع, بادره بالعبارة الجبيرة الآتية
أ + ب ن = س
فالله موجود
فما قولك?
و كان الجبر آنذاك بمثابة الطلاسم لدى الأوروبيين, فوقف ديدرو حائرا أمام المعادلة الجبرية , ثم ولى هربا مهزوما!
حساب اللوغاريتمات:
أصل كلمة "لوغاريتم" لفظ عربي و هو الخوارزمي , ترجمه الأوروبيون إلى لوجارثم و جعلوا حسابه هو "اللوجاريثمز" ثم عرب إلى اللوغاريتمات من غير رده إلى أصله.
و اللوغاريتمات هي الحساب الذي يحول عمليات الضرب إلى الجمع.
و عمليات القسمة إلى الطرح.
و الآن مع كتاب بعنوان إتقان الخوارزميات مع C "Mastering Algorithms with C" و يمكن تحميله من الرابط التالي :
http://rapidshare.de/files/1658168/O_Reill...C-1999.rar.html
الناشر: O'Reilly
تاريخ النشر: أوت 1999
عدد الصفحات: 560
كثيراً مانسمع في عالم البرمجة كلمة خوارزميات أو خوارزمية، ولكن ليس الكثير من يعرف معناها. كثيرٌ من المبرمجين لا يعلمون ماهي الخوارزميات نظرياً ولكن فعلياً يستخدمونها دون أن يعلموا (وأنا واحد منهم)! ، كيف ذلك؟
الخوارزمية تعريفاً هي سلسلة من الخطوات المنطقية المتتالية التي تُكتب بشكل منطقي لكي نحل مشكلة معنية، لذلك.. فإن كثيراً من المبرمجين لا يعلمون أن تحليل المشكلة أو التفكير بكيفية برمجة شيء هو خوارزمية بحد ذاته.
بعدما عرفنا ماهي الخوارزمية أحب أن اقول ان هذا المقال موجه للجميع سواءً من تعلم لغات البرمجة أو من لم يتعلم ويرغب في ذلك لأنها تُتيح لك امكانية تحليل الأخطاء بشكل منطقي ! وانا استخدم كلمة خطأ أو مشكلة ولكن لا أعني بها مشكلة أو خطأ بحد ذاته بل أقصد به القضية المطروحة أمامنا.
الآن سنشرح هذه الخوارزمية :
في السطرين الأول والثاني قلنا له أننا نُعطي المتغير Total & countقيمة الصفر لأنهما عبارة عن صندوقان و سيتم جمع قيم لهما، وفي السطر الثالث قلنا له أن يجلب لنا قيمة الرقم من خلال Get num. والآن في كل لغات البرمجة كلمة While تعني حلقة تكرار والآن نحن سنعمل له حلقة تكرار لماذا؟ بما أننا سندخل له أكثر من رقم فيجب علينا ان نعمل حلقة تكرار يتوقف البرنامج عن قبول الأرقام عندما يتحقق الشرط ! لم تفهم شي وانا كذلك سأشرح لك.
قلنا له طالما الرقم (يعني الرقم الذي نقوم بإدخاله ) لا يساوي صفر صفر (00), قم بمجموعة من العمليات وهي موجودة ضمن القوسين..
والآن نأتي لشرح الموجود داخل القوسين أي داخل شرط التكرار:
قلنا له في أول سطر Add num to total، أول شي لو تذكرون عرفنا المتغير توتال يساوي الصفر وقلت لكم أنه عبارة عن صندوق يجمع له قيم صحيح ؟ والآن بدأنا بجمع الأرقام التي يتم ادخالها.
قلنا له Increment count، بمعنى ان اعمل زيادة للعداد كاونت الذي عرفناه أول خطوة بقيمة صفر.
والآن انتهت الحلقة ! أي رقم ستدخله له سيقوم بجمعه للعداد الأول ومن ثم زيادة واحد لعدد الأرقام لأن فكرة المتوسط الحسابي تقوم على فكرة جمع الأرقام وتقسيمهم على عددهم، فمثلاً لدنيا الأرقام 1,3,5,6,7,8 سيقوم بجمعهم والناتج سيكون : 30 أي قيمة total ستكون 30.
وقيمة العداد الثاني وهو كاونت ستكون 6
هل فهمت ذلك؟
الآن بعدما عرفنا للبرنامج كيف يعمل اضفنا شرط صغير بعدما انتهت حلقة التكرار، قلنا له:
الشرط بكل بساطة هو انه عندما يتم ادخال القيمة صفرصفر للبرنامج فأنه سيقوم بتقسيم مجموع الأرقام على عددهم وقام باسنادهم للمتغير average ومن ثم طلبنا طباعة المتغير average، وفي كل لغة برمجة الشرط
يأتي بالصيغة هذه !!
ربما تجدونها صعبة قليلاً أو غامضة و لكن مع الوقت كل شيء سيتضح بإذن الله و كنصيحة شخصية حاول أن تتعلم لغة برمجة في نفس الوقت الذي تبدأ بتعلم الخوارزميات بعضكم سيخالفني ولكن هدفي من هذه الخطوة أن تفهم البرمجة بشكل عام وبهذه الحالة أي لغة برمجة ستجدها سهلة، ولكن افهم جيداً ان هدف الخوارزميات هو فهم طريقة البرمجة وليست طريقة الكتابة بالحرف لأنه ربما تتغير من لغة إلى لغة ثانية.
بانتظار حلولكم.
هذا كل شيء يُتبع بإذن الله و بانتظار أجوبتكم.
الخوارزمية تعريفاً هي سلسلة من الخطوات المنطقية المتتالية التي تُكتب بشكل منطقي لكي نحل مشكلة معنية، لذلك.. فإن كثيراً من المبرمجين لا يعلمون أن تحليل المشكلة أو التفكير بكيفية برمجة شيء هو خوارزمية بحد ذاته.
بعدما عرفنا ماهي الخوارزمية أحب أن اقول ان هذا المقال موجه للجميع سواءً من تعلم لغات البرمجة أو من لم يتعلم ويرغب في ذلك لأنها تُتيح لك امكانية تحليل الأخطاء بشكل منطقي ! وانا استخدم كلمة خطأ أو مشكلة ولكن لا أعني بها مشكلة أو خطأ بحد ذاته بل أقصد به القضية المطروحة أمامنا.
خصائص الخوارزمية
1- تحديد النهاية
ويعني أن الخوارزمية يجب ان تكون منتهية بعد عدد مُعين من الخطوات لا أن تمتد إلا اللانهاية ! بالعربي الفصيح ان يعرف المبرمج إلى أين يُريد الذهاب.2- عدم الغموض
أن تكون الخوارزمية واضحة وتحدد من خلالها ما الذي تريده يعني لو قرأ أي شخص الكود الذي تكتبه بكل بساطة يستطيع فهم ماهو مكتوب.3- الفعالية
وبكل بساطة يُقصد التالي : “أيها المُبرمج حاول ان تصل لمُبتغاك بأقصر الطُرق “، يعني السطر أو الكود الذي لا عمل لها احذفه فوراً لكي يتم تنفيذ برنامجك بسرعة و مرونة وهما من شروط البرنامج الناجح . خواص سهلة ومفهومة أعتقد ذلك والآن سنبدأ بإذن الله بتحليل أول قضية أمامنا.القضية الأولى
نُريد أن نكتب خوارزمية تُعطينا المتوسط الحسابي لمجموعة من الأرقام:01.set total to zero.02.set count to zero.03.Get num.04.while num not equal zerozero do05.{06.add num to total.07.increment count.08.}09.if num is zerozero {10.set average to total divided by count11.output average12.}في السطرين الأول والثاني قلنا له أننا نُعطي المتغير Total & countقيمة الصفر لأنهما عبارة عن صندوقان و سيتم جمع قيم لهما، وفي السطر الثالث قلنا له أن يجلب لنا قيمة الرقم من خلال Get num. والآن في كل لغات البرمجة كلمة While تعني حلقة تكرار والآن نحن سنعمل له حلقة تكرار لماذا؟ بما أننا سندخل له أكثر من رقم فيجب علينا ان نعمل حلقة تكرار يتوقف البرنامج عن قبول الأرقام عندما يتحقق الشرط ! لم تفهم شي وانا كذلك سأشرح لك.
1.While num not equal zerozero do1.{2.}قلنا له في أول سطر Add num to total، أول شي لو تذكرون عرفنا المتغير توتال يساوي الصفر وقلت لكم أنه عبارة عن صندوق يجمع له قيم صحيح ؟ والآن بدأنا بجمع الأرقام التي يتم ادخالها.
قلنا له Increment count، بمعنى ان اعمل زيادة للعداد كاونت الذي عرفناه أول خطوة بقيمة صفر.
والآن انتهت الحلقة ! أي رقم ستدخله له سيقوم بجمعه للعداد الأول ومن ثم زيادة واحد لعدد الأرقام لأن فكرة المتوسط الحسابي تقوم على فكرة جمع الأرقام وتقسيمهم على عددهم، فمثلاً لدنيا الأرقام 1,3,5,6,7,8 سيقوم بجمعهم والناتج سيكون : 30 أي قيمة total ستكون 30.
وقيمة العداد الثاني وهو كاونت ستكون 6
هل فهمت ذلك؟
الآن بعدما عرفنا للبرنامج كيف يعمل اضفنا شرط صغير بعدما انتهت حلقة التكرار، قلنا له:
1.If (num is zerozero)2.{3.set average to total divided by count.4.Output average5.}1.If2. 3.{4. 5.}ربما تجدونها صعبة قليلاً أو غامضة و لكن مع الوقت كل شيء سيتضح بإذن الله و كنصيحة شخصية حاول أن تتعلم لغة برمجة في نفس الوقت الذي تبدأ بتعلم الخوارزميات بعضكم سيخالفني ولكن هدفي من هذه الخطوة أن تفهم البرمجة بشكل عام وبهذه الحالة أي لغة برمجة ستجدها سهلة، ولكن افهم جيداً ان هدف الخوارزميات هو فهم طريقة البرمجة وليست طريقة الكتابة بالحرف لأنه ربما تتغير من لغة إلى لغة ثانية.
تمرين صغير
اكتب خوارزمية تقوم بجمع رقمين ومن ثم طباعة الناتج، وكمفتاح للحل الخوارزمية لا تحتاج إلى حلقة تكرار لأننا سنعتبر أن البرنامج يأخذ رقمين فقط!بانتظار حلولكم.
هذا كل شيء يُتبع بإذن الله و بانتظار أجوبتكم.
السلام عليكم ورحمة الله وبركاته
سنتناول في هذا المقال عدة مواضيع جلها تتحدث حول القاسم المشترك الأعظم نجملها في نقاط:
في هذا المقال قد يأخذك التفكير ويرسل لك برسالة نصها "مالك والرياضيات؟"
وأنا أجيبك أن هذا المقال يتناول جانب من أهم الجوانب التي ساهمت بتقدم التقنية.
ما هي عوامل الرقم ?
في البداية دعونا نوضح ما هو العامل (القاسم) ؟
إذا كان a و b أعداد صحيحة بحيث a لا تساوي صفرًا
نقول أن a عامل من عوامل b إذا وفقط إذا كانت b تقبل القسمة على a بدون باقي
وتقرأ بأحد الصور التالية:
وعندما a تقسم b نرمز لها بالشكل :
a|b
القاسم المشترك
نقول أن d قاسم مشترك للعددين a و b إذا وفقط إذا كان m|a و m|b
__________________سنتناول في هذا المقال عدة مواضيع جلها تتحدث حول القاسم المشترك الأعظم نجملها في نقاط:
- ما هو القاسم المشترك (Common Divisor) ؟
- ما هو القاسم المشترك الأعظم (Greatest Common Divisor) ؟
- كيفية احتساب القاسم المشترك الأعظم ؟
- بين النظام للأساس 10 والأساسات الأخرى.
في هذا المقال قد يأخذك التفكير ويرسل لك برسالة نصها "مالك والرياضيات؟"
وأنا أجيبك أن هذا المقال يتناول جانب من أهم الجوانب التي ساهمت بتقدم التقنية.
ما هي عوامل الرقم ?
في البداية دعونا نوضح ما هو العامل (القاسم) ؟
إذا كان a و b أعداد صحيحة بحيث a لا تساوي صفرًا
نقول أن a عامل من عوامل b إذا وفقط إذا كانت b تقبل القسمة على a بدون باقي
وتقرأ بأحد الصور التالية:
- a عامل من عوامل b
- a يقسم b
- b تقبل القسمة على a
- b من مضاعفات a
وعندما a تقسم b نرمز لها بالشكل :
a|b
اقتباس:
| مثال : 3 تقسم 15 بمعنى أنه عند قسمة 15 على 3 فإن ناتج القسمة يساوي 5 وباقي القسمة يساوي صفر. |
نقول أن d قاسم مشترك للعددين a و b إذا وفقط إذا كان m|a و m|b
اقتباس:
| مثال : ليكن لدينا الرقمين 10 و 15 ,من الواضح أن من العوامل المشتركة بين الرقمين هي المجموعة { 1,-1 ,5,-5} |
القاسم المشترك الأعظم
عرفنا سابقا مجموعة القواسم المشتركة بين رقمين وليكن a و b
نقول أن g هي القاسم المشترك الأعظم الأكبر إذا وفقط إذا كانت g أكبر عنصر في مجموعة القواسم المشتركة.
طبعا التعريف السابق مجرد تعريف لغوي وفي الرياضيات تعريفات أكثر تجريدا للقاسم المشترك الأعظم
نرمز للقاسم المشترك الأعظم للرقمين a,b بالرمز
gcd(a,b) or (a,b) . gcd=Great Common Divisor
حساب القاسم المشترك الأعظم
أولا : طريقة العوامل الأولية:
تنص هذه الطريقة على تحليل كل رقم لعوامله الأولية الموجبة ومن ثم احتساب حاصل ضرب العوامل المشتركة.
مثال :
ليكن لدينا الرقمين 126 و 30 ,
[right]126 = 2 * 3 * 3 * 7
30 = 2 * 3 * 5
نرى أن العوامل الأولية الموجبة المشتركة بين 126 و 30 هي 2 و 3 فقط
وبالتالي فإن القاسم المشترك الأعظم للرقمين = 2* 3 = 6.
طبعا لو قمنا بكتابة دالة تقوم بحساب القاسم المشترك الأعظم باستخدام طريقة التحليل فستشغل حيز كبير من الذاكرة لأنها تمر على جميع الأرقام ثم فحص هل هو أولي أم لا ثم قابلية قسمة كل من الرقمين عليه...
لكن ماذا عن حساب القاسم المشترك الأعظم للرقمين الطبيعيين :
485654825123656
769215632486563212554
هل تفكر فعلا باستخدام طريقة التحليل؟
إن فعلتها كم ستمكث من الوقت؟
إن أتممتها هل تضمن أنك لم تخطئ خلال عملية الحساب؟هنا يأتي دور الطريقة التالية(خوارزمية إقليدس).
ثانيا : خوارزمية إقليدس:
تعتبر خوارزمية إقليدس من أهم الخوارزميات التي لاقت استخدام واسع في علم الرياضيات.
تنص خوارزمية إقليدس على :
"القاسم المشترك الأعظم ل a و b يساوي القاسم المشترك الأعظم ل a وباقي قسمة b على a ونكرر هذه العملية لنحصل على باقي يساوي صفر وبالتالي فإن القاسم المشترك الأعظم يساوي آخر عدد موجب في هذه العملية".
من السهل إثبات هذه الخوارزمية لكن أعتقد أن المكان غير مناسب لهذا.
حسب النظرية لماذا آخر باقي موجب هو القاسم المشترك الأعظم؟
في النهاية نرى أن
حيث أن
gcd(r(0),0) = r(n) r(n):Last remainder
لنأخذ المثال التالي :
لنحسب القاسم المشترك الأعظم للرقمين 54125445 و 2154586
الرقم الأكبر بينهما هو 54125445
لذا نبدأ به
54125445 = 25 * 2154586 + 260795
2154586 = 8 * 260795 + 68226
260795 = 3 * 68226 + 56117
68226 = 1 * 56117 + 12109
56117 = 4 * 12109 + 7681
12109 = 1 * 7681 + 4428
7681 = 1 * 4428 + 3253
4428 = 1 * 3253 + 1175
3253 = 2 * 1175 + 903
1175 = 1 * 903 + 272
903 = 3 * 272 + 87
272 = 3 * 87 + 11
87 = 7 * 11 + 10
11 = 1 * 10 + 1
10 = 10 * 1 + 0
نلاحظ أن القاسم المشترك الأكبر بين الرقمين المذكورين هو 1 -بالرغم من كبرهما-
ننوه أن القاسم المشترك ل a و b هو نفسه القاسم المشترك ل b و a
أيضا القاسم المشترك ل -a و b هو نفسه القاسم المشترك ل a و b حيث كل من a و b أعداد صحيحة
قمت بعمل دالة تقوم بحساب القاسم المشترك لعددين a و b
كود VB.NET
كود C#
نرى أن استخدام خوارزمية إقليدس في حساب ق.م.أ أفضل بكثير من طريقة التحليل.
خوارزمية القسمةعرفنا سابقا مجموعة القواسم المشتركة بين رقمين وليكن a و b
نقول أن g هي القاسم المشترك الأعظم الأكبر إذا وفقط إذا كانت g أكبر عنصر في مجموعة القواسم المشتركة.
اقتباس:
| g = max {Integer m : m|a and m|b } |
نرمز للقاسم المشترك الأعظم للرقمين a,b بالرمز
gcd(a,b) or (a,b) . gcd=Great Common Divisor
اقتباس:
| مثال : ليكن لدينا الرقمين 10 و 20 القواسم المشتركة بين الرقمين هي : {1 , -1 , 2 , -2 , 5 , -5 , 10 , -10 } ونرى أن أكبر هذه العوامل هو القاسم المشترك 10 |
حساب القاسم المشترك الأعظم
أولا : طريقة العوامل الأولية:
تنص هذه الطريقة على تحليل كل رقم لعوامله الأولية الموجبة ومن ثم احتساب حاصل ضرب العوامل المشتركة.
مثال :
ليكن لدينا الرقمين 126 و 30 ,
[right]126 = 2 * 3 * 3 * 7
30 = 2 * 3 * 5
نرى أن العوامل الأولية الموجبة المشتركة بين 126 و 30 هي 2 و 3 فقط
وبالتالي فإن القاسم المشترك الأعظم للرقمين = 2* 3 = 6.
طبعا لو قمنا بكتابة دالة تقوم بحساب القاسم المشترك الأعظم باستخدام طريقة التحليل فستشغل حيز كبير من الذاكرة لأنها تمر على جميع الأرقام ثم فحص هل هو أولي أم لا ثم قابلية قسمة كل من الرقمين عليه...
لكن ماذا عن حساب القاسم المشترك الأعظم للرقمين الطبيعيين :
485654825123656
769215632486563212554
هل تفكر فعلا باستخدام طريقة التحليل؟
إن فعلتها كم ستمكث من الوقت؟
إن أتممتها هل تضمن أنك لم تخطئ خلال عملية الحساب؟هنا يأتي دور الطريقة التالية(خوارزمية إقليدس).
ثانيا : خوارزمية إقليدس:
تعتبر خوارزمية إقليدس من أهم الخوارزميات التي لاقت استخدام واسع في علم الرياضيات.
تنص خوارزمية إقليدس على :
"القاسم المشترك الأعظم ل a و b يساوي القاسم المشترك الأعظم ل a وباقي قسمة b على a ونكرر هذه العملية لنحصل على باقي يساوي صفر وبالتالي فإن القاسم المشترك الأعظم يساوي آخر عدد موجب في هذه العملية".
من السهل إثبات هذه الخوارزمية لكن أعتقد أن المكان غير مناسب لهذا.
حسب النظرية لماذا آخر باقي موجب هو القاسم المشترك الأعظم؟
رموز PHP:
b = a.q(0) + r(0)a = r(0).q(1) + r(1)r = r(1).q(2) + r(2)
......
......r(n-2) = r(n-1).q(n) + r(n)r(n-1) = r(n).q(n+1) + 0 في النهاية نرى أن
رموز PHP:
gcd(r(n),0) = r(n) gcd(r(0),0) = r(n) r(n):Last remainder
لنأخذ المثال التالي :
لنحسب القاسم المشترك الأعظم للرقمين 54125445 و 2154586
الرقم الأكبر بينهما هو 54125445
لذا نبدأ به
54125445 = 25 * 2154586 + 260795
2154586 = 8 * 260795 + 68226
260795 = 3 * 68226 + 56117
68226 = 1 * 56117 + 12109
56117 = 4 * 12109 + 7681
12109 = 1 * 7681 + 4428
7681 = 1 * 4428 + 3253
4428 = 1 * 3253 + 1175
3253 = 2 * 1175 + 903
1175 = 1 * 903 + 272
903 = 3 * 272 + 87
272 = 3 * 87 + 11
87 = 7 * 11 + 10
11 = 1 * 10 + 1
10 = 10 * 1 + 0
نلاحظ أن القاسم المشترك الأكبر بين الرقمين المذكورين هو 1 -بالرغم من كبرهما-
ننوه أن القاسم المشترك ل a و b هو نفسه القاسم المشترك ل b و a
أيضا القاسم المشترك ل -a و b هو نفسه القاسم المشترك ل a و b حيث كل من a و b أعداد صحيحة
قمت بعمل دالة تقوم بحساب القاسم المشترك لعددين a و b
كود VB.NET
رموز PHP:
Public Shared Function GreateCommonDivisor(a As Integer, b As Integer) As Integer
'using Euclid's algorithm
Dim result As Integer = 1
'Calculate the absolute value of a,b
a = Math.Abs(a)
b = Math.Abs(b)
If a = 0 AndAlso b = 0 Then
Throw New Exception("Two zeros elemnts have unlimited common divisors")
End If
'If one of a or b is zero then return the other
If a = 0 Then
Return b
End If
If b = 0 Then
Return a
End If
Dim max As Integer = Math.Max(a, b)
Dim min As Integer = Math.Min(a, b)
b = max
a = min
Dim r As Integer = 1
Dim q As Integer = 0
While r <> 0
q = b a
r = b Mod a
b = a
If r <> 0 Then
a = r
End If
End While
result = a
Return result
End Function كود C#
رموز PHP:
public static int GreateCommonDivisor(int a, int b)
{
//using Euclid's algorithm
int result = 1;
//Calculate the absolute value of a,b
a = Math.Abs(a);
b = Math.Abs(b);
if (a == 0 && b == 0) throw new Exception("Two zeros elemnts have unlimited common divisors");
//If one of a or b is zero then return the other
if (a == 0) return b;
if (b == 0) return a;
int max = Math.Max(a, b);
int min = Math.Min(a, b);
b = max; a = min;
int r = 1;
int q = 0;
while (r != 0)
{
q = b / a;
r = b % a;
b = a;
if(r!=0) a = r;
}
result = a;
return result;
} نرى أن استخدام خوارزمية إقليدس في حساب ق.م.أ أفضل بكثير من طريقة التحليل.
قبل أن ندخل لهذا الموضوع علينا التطرق قليلا لخوارزمية القسمة والتي تنص على :
إذا كان a و b عددين صحيحين بحيث a>0 فإنه يوجد زوج وحيد q,r من الأعداد الصحيحة يحقق :
b = q*a + r , 0 =< r < a
b : الرقم المقسوم.
a : المقسوم عليه.
q : ناتج القسمة.
r : باقي القسمة.
مثلا:
عند قسمة 11 على 5 :
11 = 2 * 5 + 1
الباقي 1 أكبر أو يساوي صفر وأقل من 5
النظام الثنائي
بالرجوع لخوارزمية القسمة فإنه مجموعة البواقي عند قسمة أي رقم على 2 هما 0 أو 1
حيث كلاهما أكبر أو يساوي صفر وأقل من 2
وتم الاستفادة من هذه الخوارزمية في تحويل الأرقام بين الأنظمة المختلفة.
مثلا: لتحويل الرقم 13 من النظام العشري إلى النظام الثنائي
13 = 6 * 2 + 1
6 = 3 * 2 + 0
3 = 1 * 2 + 1
1 = 0 * 2 + 1
وبالتالي نرى أن الرقم 13 بالنظام العشري يعادل 1101 بالنظام الثنائي
قمت بكتابة كود يقوم بتحويل أي رقم عشري إلى ثنائي اعتمادا على خوارزمية القسمة.
كود VB.NET
رموز PHP:
Function ToBinary(d As Integer) As Integer
Dim result As Integer = 0
Dim exp As Integer = 0
While d > 0
'Here we get the result of deviding the decimal which be 0 or 1
'the we multiply each number by 10 powered to exp
'exp is increasing by 1 every loop
result += (d Mod 2) * CInt(Math.Pow(10, exp))
exp += 1
'here we devide the number by 2 to redo the loop
'For example
'5 = 2 * 2 + 1
'2 = 1 * 2 + 0
'1 = 0 * 2 + 1
i.e : 5 = 101
d = CInt(Math.Truncate(d / 2.0))
End While
Return result
End Function رموز PHP:
int ToBinary(int d)
{
int result = 0;
int exp = 0;
while (d > 0)
{
//Here we get the result of deviding the decimal which be 0 or 1
//the we multiply each number by 10 powered to exp
//exp is increasing by 1 every loop
result += (d % 2) * (int)Math.Pow(10, exp);
exp += 1;
//here we devide the number by 2 to redo the loop
d = (int)(d / 2.0);
//For example
//5 = 2 * 2 + 1
//2 = 1 * 2 + 0
//1 = 0 * 2 + 1
//i.e : 5 = 101
}
return result;
} 13 = 1 + 0 + 4 + 8
وهنا كود للرجوع :
كود VB.NET
رموز PHP:
Function ToDecimal(b As Integer) As Integer
Dim result As Integer = 0
Dim exp As Integer = 0
While b > 0
'Here we get the first digit
'For example
'100101 ,How we can get firstDigit=1?
'Simply we devide by 10 the we get 10010.1
'and convert it into integer (int)(10010.1)=10010
'and again we multiply the result(10010) by 10
'the we get 100100
'finally we abstract the result from the source 100101 - 100100 = 1
Dim firstDigit As Integer = b - (CInt(Math.Truncate(b / 10.0)) * 10)
'multiply first digit by 1=2^0
'and the second by 2=2^1
'and the first by 4=2^2
'and so
'Note that the Exponent increases by 1 each time
result += firstDigit * CInt(Math.Pow(2, exp))
exp += 1
'And now we need to devide the number by 10
'and invoke the loop again
'100101 >> 10010
b = CInt(Math.Truncate(b / 10.0))
End While
Return result
End Function كود C#
رموز PHP:
int ToDecimal(int b)
{
int result = 0;
int exp = 0;
while (b > 0)
{
//Here we get the first digit
//For example
//100101 ,How we can get firstDigit=1?
//Simply we devide by 10 the we get 10010.1
//and convert it into integer (int)(10010.1)=10010
//and again we multiply the result(10010) by 10
//the we get 100100
//finally we abstract the result from the source 100101 - 100100 = 1
int firstDigit = b - ((int)(b / 10.0) * 10);
//multiply first digit by 1=2^0
//and the second by 2=2^1
//and the first by 4=2^2
//and so
//Note that the Exponent increases by 1 each time
result += firstDigit * (int)Math.Pow(2, exp);
exp += 1;
//And now we need to devide the number by 10
//and invoke the loop again
//100101 >> 10010
b = (int)(b / 10.0);
}
return result;
} في النهاية هل تروا أن مثل هذه المقالات مناسبة للمنتدى؟
__________________
كنت قد أنتهيت من دالة تقوم بتحويل أي رقم عشري إلى أي نظام لأساس آخر ما بين -36 و 36
وقد صممت الدالة لترجع قيمة نصية للناتج لانه يظهر في التحويل للنظام السادس عشر مثلا أحرف مثل
A,B,C,D,E,F
وتظهر الأحرف في كل نظام أكبر من 10 وأقل من -10
رموز PHP:
public static string ConvertToAnotherBaseSystem(int NumberInDecimal, int Base)
{
if (!((Base < 37 && Base > 1) || (Base < -1 && Base > -37))) throw new Exception("Base must be between 2 and 36");
int sign = Sign(NumberInDecimal);
NumberInDecimal = Math.Abs(NumberInDecimal);
StringBuilder SB = new StringBuilder();
while (NumberInDecimal != 0)
{
bool flag=false ;
int remainder = NumberInDecimal % Base;
if (remainder < 0) { remainder -= Base; flag = true; }
string temp = remainder.ToString();
if ((remainder) > 9)
temp = char.ConvertFromUtf32(55 + (remainder));
if (SB.ToString() == "") { SB.Append(temp); }
else { SB.Insert(0, temp); }
if (flag) NumberInDecimal += Base;
NumberInDecimal = (int)(NumberInDecimal / (double)Base);
}
string result = SB.ToString();
if (sign < 0) result = "-" + result;
return result;
} رموز PHP:
Maths.Numerics.Integers.ConvertToAnotherBaseSystem(541106,16) //841B2Maths.Numerics.Integers.ConvertToAnotherBaseSystem(541106,2) //10000100000110110010Maths.Numerics.Integers.ConvertToAnotherBaseSystem(541106,36) //BLIQMaths.Numerics.Integers.ConvertToAnotherBaseSystem(541106,-17) //793CDMaths.Numerics.Integers.ConvertToAnotherBaseSystem(-541106,20) //-37CF6 بخصوص القاسم المشترك الأكبر والمضاعف المشترك الأصغر:
أنت تحسب القاسم المشترك الأكبر والمضاعف المشترك الأصغر لعددين صحيحين
وهذا يعني أنك من المحتمل أن تواجه أعداد سالبة
لنرجع للدالة الأولى مثلا :
رموز PHP:
def gcd(a , b):
while a <> b :
if a > b : a - = b
else : b - = a
return a تخيل أننا قمنا بتمرير الرقمين 5 و -1
5 أكبر من -1 وبالتالي وبعد طرح -1 من 5 سيظهر لدينا 6 و ستبقى على هذه الحال,وبالتالي لن تتوقف الحلقة. والحل هنا:
رمز برمجي: