الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج لحساب الأعداد الأولية ..

بدأه مصطفى 36a2 في 18 سبتمبر 2012 · 7 رد · 7,866 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

بفضل الله تعالى ..ثم بجهود الإخوة محمد ومصطفى جزاهما الله خيراً ...دخلت عالم python الصغير ...

المهم وبعد المقدمات ... هذا البرنامج رياضي بحت .. حيث يقوم بتخزين 100000رقم أولي ...ثم يأخذ من المستخدم ترتيب الرقم الأولي ويعرضه

مثلاً الرقم الأولي الذي ترتيبه 10 هو 29 والذي ترتيبه 2 هو 3 ..وهكذا...

ينتهي الإدخال عند إدخال الرقم 0 ..

طبعاً لغة python بطيئة جدا جدا مقارنة مع C مثلا والتي تشتغرق 0.01 من الثانية مقابل 10 ثواني لpython

فهل هناك خطأ في استعمال الدوال مثلاً ... أو نوع الlist مثلا؟؟

الجواب الذي يجعل التنفيذ أقصر هو الجواب المنتظر ... أما إن كانت python لا يمكنها العمل أسرع من ذلك ...فاعتبروا البرنامج هدية مني laugh.gif

(طبعاً من يمكنه إعطاء خوارزمية أسرع سيكون خارقاً للعادة ..بالتأكيد سأرشحه كإجابة )

i=1
p=[0,2]
while i<1299711:
    	i+=2
    	j=1
    	while i>p[j]**2 and i%p[j]!=0:
            	j+=1
    	if i<p[j]**2:
            	p.append(i)
n=input()
while n!=0: 
	print p[n]
	n=input()

والسلام عليكم ورحمة الله وبركاته

____________________

ملاحظة : من يمكنه أيضاً اختصار الكود بمقدار أكثر من 20 حرف سيكون إجابة مقبولة كذلك بشرط ألا يزيد وقت التنفيذ عن البرنامج الحالي ..

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 19 سبتمبر 2012 في 13:45

#2

السلام عليكم

اشكرك صديقي ,,,

على الاهداء جعلها الله في ميزان حسناتك

هذا كود لي كنت مشارك في مسابقة وتذكرته عن طريق موضوعك

جربه ادخل اي رقم يعطيك قبله وبعدستمر بعده

اعداد اولية

i = 0
Num = input("Enter Num:")
nums = range(2,31)
for i in range(2,25):
    nums = filter(lambda x: x == i or x % i, nums)
    print nums

بالنسبة لي انا الان متوسط في بايثون

لا اعرف اقرر بايثون اسرع ام C

عندم اصل للمرحلة المناسبة سوف ارجع افتح الموضوع

اشكرك مرة ثانية صديقي

سؤال : متى دخلت لغة بايثون ؟

تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 18 سبتمبر 2012 في 22:15

1

salah.jpg

#3
اقتباس
سؤال : متى دخلت لغة بايثون ؟

منذ ثلاثة أيام ..laugh.gif...ولازلت أدخل laugh.gif... أمهلني نصف ساعة حتى أفهم filter و lambda في كودك ...wink.gif

اقتباس

لا اعرف اقرر بايثون اسرع ام C

لست مضطرا لدراسة بايثون من الألف للياء حتى تتعلم C ... يعني ابدأ بتعلم الC بالتوازي معpython ..

اقتباس
جربه ادخل اي رقم يعطيك قبله وبعستمر بعده

...حبذا لو تعيد كتابة هذه الجملة ..

فلم أفهم علاقة الكود بالسؤال لكن شكراً لك..smile.gif

تحياتي

#4
اقتباس
أمهلني نصف ساعة حتى أفهم filter و lambda

الحمد لله فهمتها ...الfilter >> يقوم باختبار القيم الموجودة في list ويعيد القيم التي حققت الشرط في التابع الضمني lambda إلى الطرف الأيسر ..

وبذك يكون بعد كل عملية "فلترة "..نتخلص من العناصر التي لا تحقق الشرط ..

يعني filter يأخذ وسيطين ... تابع يعيد قيمة منطقية ويأخذ وسيط هو قيمة من الوسيط الثاني ..وlist هو الوسيط الثاني

lambda هي تابع مضمن (يمكن أن نعرفه فوق عن طريق def ونسميه) وهو بدون اسم .. يأخذ وسيط x ويعيد قيمة منطقية 1 إذا لم يكن العنصر من مضاعفات العنصر i ...

يعني في الآخر كودك يقوم في الآخر بطباعة قائمة فيها الأعداد الأولية الموجودة ضمن أول range ....

_______________________________

ولكن يجب أن يكون الrange الثاني يحتوي على جذر آخر رقم في الrange الأولى كحد أدنى ...حتى يكون البرنامج فعالاً ...

______________كما أن الإدخال لا علاقة له بالإخراج !!!! غريب ......______________

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 18 سبتمبر 2012 في 23:09

#5

بالاعتماد على كودك أخي مصطفى ومع بعض التطوير ..سيكون هذا الكود هو ما أردت أن تقوله بالفعل ..smile.gif

يأخذ رقما من المستخدم ويطبع جميع الأرقام الأولية الأصغر من هذا الرقم ..

i = 0
Num = input("Enter Num:")
nums = range(2,Num)
for i in range(2,int(Num**0.5)+1):
	nums = filter(lambda x: x == i or x % i, nums)
print nums

أجمل ما في python هو قصر الكود .. واستعمال عمليات معقدة بتعليمات بسيطة ودون تضمين مكتبات ...(يعني لا نضطر لاستعمال الكثير منimport في الغالب )

حسناً ... هذه الخوارزمية مختلفى عن التي أخبرتك عنها في سؤالي ... وهي للأسف بطيئة جداً ... بكلام رياضي أكثر تعقيد هذه الخوارزمية هو :( Num^0.5 )*(Num)

يعني سيقوم البرنامج بعدد من العمليات هو جذر العدد المدخل ... لو أدخلنا 100 سيقوم ب1000 عمليات ... مضروباً بعدد العمليات داخل التابع filter (والمجهول بالنسبة للمبرمج )

يعني عدد كبير جدا من العمليات ... ولذلك فهذا الحل غير مقبول (بالنسبة لسؤالي على الأقل ) ولكنها طريقة لا بأس بها ..

يمكنك التعديل عليها ...فإذا كان الrange الثاني يحتوي على أعداد اولية فقط فستكون هذه خوارزمية أسرع بكثييير وهي معروفة باسم : Sieve of Eratosthenes

شكراً لك أخي مصطفى ... والسلام عليكم

#6
ولكن يجب أن يكون الrange الثاني يحتوي على جذر آخر رقم فيخر  الrange الأولى كحد أدنى ...حتى يكون البرنامج فعالاً ...

احسنت .

جيد وهو موجود امامك

في ال range الاول يحدد البدء والنهاية اي ارقم الاول والرقم الاخير

بحيث اذا ادخل رقم

3

اما ال range الثاني

يقوم بالعمل عن طريق المدهل مثل

بحيث اذا ادخل رقم

3

سوف يبدء من اول رقم اولي ومن ثم

سوف يطبع لك اخر رقم اولي قبل 25 اي (النهائي)

اعتقد فهمت

اختصار

الاول مكان البدء والنهاية اي لا يتعدا رقم 31

والثاني مكان الذي يخص المدخل

تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 18 سبتمبر 2012 في 23:40

salah.jpg

#7

نعم وحتى يكون سبب تقييم إجابتك واضحاً ...

فقد قمت بدمج فكرة الكود عندك أخي مصطفى مع هدف الكود عندي ...وكانت النتيجة هي البرنامج التالي ..

i = 0
nums = range(2,490000)
for i in range(2,700):
	nums = filter(lambda x: x == i or x%i,nums)
i=input()
while i:
	print nums[i-1]
	i=input()

والآن انظر ... هذا البرنامج يمكنه حساب الأرقام الأولية حتى 490ألف فقط ويأخذ 11 ثانية تقريباً ....

بينما البرنامج الذي وضعته في السؤال (وهي أسرع الخوارزميات التي أعرفها ) يوجد الأرقام الأولية حتى 12 مليون تقريباً ويأخذ 10 ثوان ...

هل لاحظت الفرق ... إذا صحيح أن البرنامج أقصر إلا أن الوقت أطول بكثير جداً ...

سيستغرق كودك ليصل إلى الأرقام الأولية الأقل من 12مليون ..حوالي 41,569,219,381عملية .. بالنسبة لمعالج 1غيغا يعمل بكامل طاقته سيستغرق ذلك 41 ذانيه كحد أدنى ...

جزاك الله خيراً ... أفدتني من ناحية اللغة ولاأزال أستفيد منك ... بارك الله فيك ...

#8

شكرا جزيلا لغة البايثون اصبحت من اهم المواضيع الان في لغات البرمجة

كيف يمكن البحث عن عدد الكلمات Token وعدد TOKEN TYPE باستخدام لغة البايثون ؟؟

حيث ان لغة باثون تستخدم في معالجة اللغات الطبيعية ..

مواضيع مشابهة