البرمجة البرمجة جهز الموضوع للطباعة
طباعة الصفحة:
1 من 2
إذهب الى منتدى:
-- إختار منتدى من القائمة --
~|| الأعداد الأولية رياضياً و برمجياً ||~ Prime Numbers || VB.Net , C# , C++ , Java
الصفحة التالية الصفحة الأخيرة عرض جميع المشاركات بالكامل تصغير عرض جميع المشاركات
The Black Matrix
00:09 - 2012/01/28 معلومات عن العضو Tweet
بسم الله الرحمن الرحيم
الحمد لله على ما أعطانا و نشكره على نعمه التي لا تعد و لاتحصى
وندعوه تقبل طاعاتنا و أعمالنا و يرضى عنا بالدنيا و الآخرة
ربنا صلِ على سيدنا محمد - صلى الله عليه وسلم - و على آل سيدنا محمد
و على أصحاب سيدنا محمد و على كل من سار على نهج الإسلام و اهتدى بهدي
الإسلام ، وأدعوك يا الله أن تفرج عن اخواننا في فلسطين
و العراق و السودان و الصومال و عن كل بلاد المسلمين، و اهد كل من ضل عن
سواء السبيل.
اللهم آمين
أولاً: التعريف بالأعداد الأولية
*** الأعداد الأولية (Prime Numbers): هي أعداد طبيعية – و هي الأعداد الصحيحة و الموجبة
مثل 1،2،3،... – و أكبر من واحد و ذلك يعني أن الواحد لا تدخل ضمن هذا المجال ،
و تتميز هذه الأعداد بأن قواسمها (Factors) محصوران في رقمين لا ثالث لهما و هما بالتحديد
العدد نفسه و الرقم واحد أي أن هذه الأرقام تقبل القسمة على نفسها و الرقم واحد بدون باقي.
** و أول عدد أولي هو الرقم إثنان (2) و من الملاحظ أنه لا يقبل القسمة إلا على الرقم نفسه
و هو 2 و الرقم 1 بدون باقي.
** الرقم واحد لا يدخل ضمن هذه الفئة **
** هناك أعداد كثيرة أولية لا حصر لها مثل:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61.
ثانياً: التفكير برمجياً لإيجاد الأعداد الأولية.
** حسناً لنفكر قليلاً بما أن الأعداد الأولية لا تقبل القسمة إلا على نفسها و الواحد
بدون باقي فإن جميع الأعداد التي ضمن الفترة من الواحد إلى الرقم نفسه إذا قسمناها
على الرقم الذي نريد التحقق منه ستعطي باقي أي عدد أكبر من واحد للتوضيح
لاحظ الشكل التالي الذي يوضح العدد 7 كعدد أولي.
** r ترمز إلى الباقي (Remainder).
حسناً، كما نلاحظ العدد سبعة قبِل القسمة على 7 و 1 بدون باقي فقط
حسنا ، العدد 4 عدد غير أولي لذلك
2
نلاحظ من الشكل السابق أن العدد 4 قبل القسمة على 4 و 2 و 1 بدون باقي
و ذلك يعني أنه عدد غير أولي.
و ذلك يعطينا فكرة معينة لتطبيقها بالبرمجة
أن نقوم بالتحقق من جميع الأرقام الواقعة بين 1 و العدد نفسه في ما إذا كان
واحد منهم على الأقل يقبل القيمة بدون باقي و الكود سيكون بالشكل التالي:
الشرح سيكون بالفيجوال بيسك .نت و بالنهاية سأضع الكود الآخير بعدة لغات.
VB.Net
Functio n isPrime(ByVal Num As Double) As Boolean
Dim A As Integer
For i = 2 To Num
A = Num Mod i
If A = 0 Then
Return False
End If
Return True
Next
End Functio n
في الحقيقة الكود السابق هو كود سيكتبه أي شخص سيبدأ للتفكير بالحل
و لكن تعالوا لنفكر بمنطق رياضي قليلاً
إذا وضعت واحد الحلقة لن تعمل و بالتالي الناتج True و هذا أول خطأ
ثانياً لماذا لا أتأكد من قابلية القسمة العدد على 2 و 3 و5 و من
ثم أبدأ الحلقة و السبب أن الكثير من الأرقام تقبل القسمة عليها و خاصة العدد 2 ،
و أيضاً لماذا أقوم بالتحقق من قابلية القسمة العدد المطلوب التحقق منه
وهو هنا (Num) على الأعداد الزوجية فأنا لا أريد أن يتحقق
منها لأنني تأكدت بنفسي من خلال تجربة قسمته على 2 و للتوضيح
مثلا العدد 18 يقبل القسمة على 2 لذلك ليس علي التحقق من الرقم 6 لأنه
عبارة عن ضرب 2 في 3!!!!
و الكود الناتج سيكون كالتالي
VB.Net
Functio n primo(ByVal Num As Double) As Boolean
Dim A As Double
If Num = 1 Then Return False
If (Num = 2) Or (Num = 3) Or (Num = 5) Then Return True
If Num Mod 2 = 0 Or Num Mod 3 = 0 Or Num Mod 5 = 0 Then
Return False
Else
For i = 3 To Num Step 2
A = Num Mod i
If A = 0 Then
Return False
End If
Next
End If
Return True
End Functio n
الكود السابق فعّال جدا و سريع للأعداد الضخمة جداً
و من الملاحظ أنني تأكدت من الأعداد 2 و 3و 5 بالأول و هذا للسرعة فقط و ظهور بعض الأخطاء بدونهم.
حسناً، هناك شيء أخير و هو أنني يمكنني أن أصغر عدد الأرقام التي سأتحقق منها و ذلك من خلال ما يلي
لماذا تكون الحلقة من 2 إلى العدد نفسه ؟
بصراحة السؤال غريب قليلاً، لنفكر مرة أخرى قليلاً
يمكننا التحقق من 2 إلى الرقم الصحيح للجذر التربيعي للعدد فقط ؟؟؟؟؟؟
حسنا لنفكر قليلا و نجرب على العدد 64
64 = 8 * 8
و أنا أقول أن نتأكد من 2 إلى 8 فقط
و السبب أنه لو أردنا أن نضع رقم أكبر من 8
64 = 16 * 4
سنلاحظ وجود رقم آخر و هو الأربعة لذلك إذا كان الأربعة يقبل القسمة
بدون باقي فإن 16 سيقبل بدون باقي لذلك اختصرت طريق طويلة جداً
و الكود الجديد سيكون كالتالي
VB.Net
Functio n primo(ByVal Num As Double) As Boolean
Dim A As Double
If Num = 1 Then Return False
If (Num = 2) Or (Num = 3) Or (Num = 5) Then Return True
If Num Mod 2 = 0 Or Num Mod 3 = 0 Or Num Mod 5 = 0 Then
Return False
Else
For i = 3 To Int(Math.Sqrt(Num)) Step 2
A = Num Mod i
If A = 0 Then
Return False
End If
Next
End If
Return True
End Functio n
هذا الكود فعّال و سريع و مرعب لأنه سيتأكد من أي رقم بسرعة
**** ملاحظة أخيرة العدد السالب ليس عدد أولي لذلك في أي برنامج قم
بالتأكد من العدد ليس سالب و أيضاً ليس صفر لأنه لا يدخل ضمن هذه الأعداد .!!!
و هناك ملاحظة صغيرة: أنه ليس علي المرور بالأعداد الزوجية لذلك سأبدأ
بالعدد 3 و أقفز مرتين Step 2،
، و هذا يجعل الكود أسرع بالإضافة أن الكود النهائي
غيرت نوع المتغيرات إلى Int64 لأنها تستوعب أرقام أكبر من Integer العادية.
ثالثاً: البرنامج النهائي بعدة لغات
VB.Net
Functio n primo(ByVal Num As Int64) As Boolean
Dim A As Int64
If Num = 1 Then Return False
If (Num = 2) Or (Num = 3) Or (Num = 5) Then Return True
If Num Mod 2 = 0 Or Num Mod 3 = 0 Or Num Mod 5 = 0 Then
Return False
Else
For i = 3 To Convert.ToInt64(Math.Sqrt(Num)) Step 2
A = Num Mod i
If A = 0 Then
Return False
End If
Next
End If
Return True
End Functio n
و
C#
public static bool primo(Int64 Num)
{
Int64 A = 0;
if (Num == 1)
return false;
if ((Num == 2) | (Num == 3) | (Num == 5))
return true;
if (Num % 2 == 0 | Num % 3 == 0 | Num % 5 == 0) {
return false;
} else {
for (int i = 3; i <= Convert.ToInt64(Math.Sqrt(Num)); i += 2) {
A = Num % i;
if (A == 0) {
return false;
}
}
}
return true;
}
و
C++
#include <math.h>
bool primo(long long Num)
{
long A = 0;
if (Num == 1)
return false;
if ((Num == 2) | (Num == 3) | (Num == 5))
return true;
if ((Num % 2 == 0) || (Num % 3 == 0) || (Num % 5 == 0)) {
return false;
} else {
for (int i = 3; i <= long(pow(Num,0.5)); i += 2) {
A = Num % i;
if (A == 0) {
return false;
}
}
}
return true;
}
و
Java
public static boolean primo(long Num) {
long A = 0;
if (Num == 1)
return false;
if ((Num == 2) || (Num == 3) || (Num == 5))
return true;
if ((Num % 2 == 0) || (Num % 3 == 0) || (Num % 5 == 0)) {
return false;
} else {
for (int i = 3; i <= (long)Math.sqrt(Num); i += 2) {
A = Num % i;
if (A == 0) {
return false;
}
}
}
return true;
}
خاتمة
الأكواد تم تجربتها و بإذن الله صحيحة فهي مجربة حتى على الأرقام الضخمة مثل
18014398241046527
الكتاب ليس ضخم و لا كامل لأن الكمال لله و هو عمل بسيط مني
لإثراء المكتبة العربية و الشكر الخالص لله أولاً و ثانياً لإخواني في منتدى ستار تايمز في قسم لغات البرمجة
رابط كتاب للدرس: http://www.mediafire.com/?q6wv9gwleep9ey4
الأحد مايو 05, 2024 7:07 pm من طرف سها مجدى
» غسيل مكيفات سبليت بالرياض
الأربعاء أبريل 17, 2024 5:59 pm من طرف سها مجدى
» شركة تشطيب فلل بالباحة
الثلاثاء أبريل 09, 2024 6:36 pm من طرف سها مجدى
» شركة مقاولات بالمبرز
الأربعاء أبريل 03, 2024 4:53 pm من طرف سها مجدى
» شركة نقل عفش بالرياض الياسمين
الجمعة مارس 22, 2024 7:02 pm من طرف سها مجدى
» مقاول اسفلت بالرياض
الخميس مارس 14, 2024 12:12 am من طرف سها مجدى
» شركة تركيب المصاعد بعسير
الجمعة مارس 08, 2024 8:34 pm من طرف سها مجدى
» مبلطين ممتازين بالرياض
الثلاثاء مارس 05, 2024 10:49 pm من طرف سها مجدى
» شركة مقاولات بخميس مشيط
السبت مارس 02, 2024 11:03 pm من طرف سها مجدى