• 0
مصطفى 36a2

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

سؤال

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

بفضل الله تعالى ..ثم بجهود الإخوة محمد ومصطفى جزاهما الله خيراً ...دخلت عالم 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
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

السلام عليكم

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

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

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

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

اعداد اولية

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
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
سؤال : متى دخلت لغة بايثون ؟

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

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

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

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

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

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

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أمهلني نصف ساعة حتى أفهم filter و lambda

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

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

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

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

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

_______________________________

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

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

تم تعديل بواسطه مصطفى 36a2
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالاعتماد على كودك أخي مصطفى ومع بعض التطوير ..سيكون هذا الكود هو ما أردت أن تقوله بالفعل ..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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

احسنت .

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

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

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

3

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

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

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

3

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

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

اعتقد فهمت

اختصار

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

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

تم تعديل بواسطه MuStafa - HaSsan
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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 ذانيه كحد أدنى ...

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .