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

Prime Factorization

بدأه C++er في 5 أغسطس 2011 · 3 رد · 1,018 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

استيقظت اليوم و انا افكر فى الـ prime factors الخاصه بالرقم 132 (تحدث لي مثل هذه الأمور كما اعتقد انها تحدث للغير)، و بعد ان عرفت الإجابه - و هي 2 * 2 * 3 * 11 - فكرت فى صناعة برنامج أقوم بإدخال الرقم إليه و يقوم هو بإخراج لي الـ prime factors.

المقصود بالـ prime factorization هو أن كل رقم يمكن تمثيله بمجموعه من الأعداد الأوليه - كما حدث مع الرقم 132.

خطوات عمل البرنامج بسيطه، و المتطلبات وجود مصفوفه للأعداد الأوليه:

1- يقوم المستخدم بإدخال الرقم.

2- إذا كان الرقم أقل من 3 و اكبر من -3 يطبع الرقم كما هو و يتم الإنهاء.

3- يتم الحصول على القيمه المطلقه للرقم المدخل و تخزين الإشاره فى مكان منفصل.

4- يتم الدوران على كل عناصر مصفوفه الأعداد الأوليه.

5- يتم الذهاب إلى الخطوه التاليه طالما يوجد عدد اولي و ان الرقم (من الخطوه 3) لا يساوى 1 و غير ذلك يتم الذهاب للخطوه 9.

6- يتم الحصول على باقي قسمة الرقم (من الخطوه 3) من العدد الأولي.

7- إذا كان باقي القسمه لا يساوي صفر يتم الذهاب إلي 4، إذا كان باقي القسمه صفر يتم الإكمال.

8- يتم طباعة العدد الأولي و يتم الحصول على قسمة الرقم (من الخطوه 3) من العدد الأولي و إبدال الرقم (من الخطوه 3) بنتيجة القسمه و يتم الذهاب إلي 3.

9- إذا كانت الإشاره سالبه يتم ضرب أى من الأعداد الأوليه فى -1.

الطبيعي ان يكون الرقم المدخل أكبر من 1 و لكني وجدت ان وجود الأعداد السالبه لن يعقد البرنامج كثيرا.

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

هذه أحد النتائج:

enter number: 1919191919
result is: 19 * 41 * 271 * 9091
Press any key to continue . . .

enter number: 3654120
result is: 2^3 * 3 * 5 * 37 * 823
Press any key to continue . . .

المرفقات هي الملف prime_gen و الذى يقوم بتوليد ملف يحتوى على مصفوفه بالأعداد الأوليه و المرفق الثاني هو برنامج prime_fac

prime_gen.rar

pri_fac.7z

تم تحديث المرفقات لوجود خطأ فى الداله isPrime بالبرنامج prime_gen، الخطأ كان فى الزياده داخل الحلقه حيث من المفترض ان يكون 2 بدلا من 3، إذا قمت بتغييرها بنفسك فلا تنسي إعادة بناء المصفوفه primes لحذف الزوائد منها.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 10 أغسطس 2011 في 05:22

2

مدونتي: C++ Tips and Tricks

#2
sage: p=Primes()
sage: p.next(76324324532)
76324324603
sage: p.next(12312321321)
12312321341
sage: 76324324603*12312321341
939729610646928252623
sage: fac
factor     factorial  
sage: factor(939729610646928252623)
12312321341 * 76324324603

[ahmed@T400 primes]$ ./a.out 
enter number: 939729610646928252623
result is: 7^2 * 73 * 127 * 337 * 92737 * 649657

sage: 7^2 * 73 * 127 * 337 * 92737 * 649657
9223372036854775807

فيه مشكلة صغيرة، أنك مش بتستخدم أي أساس علمي هنا.

لو أنت عرفت تعمل factorization بسرعة فائقة.

فك الأرقام دول:

http://www.rsa.com/rsalabs/node.asp?id=2093

و لو عرفت، ممكن تكسب مليون دولار.

[ahmed@T400 primes]$ time ./a.out 
enter number: 79164707846020039
^C

real	2m43.402s
user	2m40.090s
sys	0m0.104s
[ahmed@T400 primes]$

sage: p=Primes()
sage: p.next(123456789)
123456791
sage: p.next(641234124)
641234129
sage: 123456791*641234129
79164707846020039
sage: fac
factor     factorial  
sage: factor(79164707846020039)
123456791 * 641234129
sage:

ال-algorthem لا تصلح فيه فك أي شيء.

Complicity بتعته كبيرة جدا

تم تعديل هذه المشاركة بواسطة -Ahmed Hassan في 9 أغسطس 2011 في 20:57

وَمَا أُوتِيتُمْ مِنْ الْعِلْمِ إِلاَّ قَلِيلاً

#3

جميل

تم تعديل هذه المشاركة بواسطة Ali Al-Zyoud في 9 أغسطس 2011 في 22:06

#4
اقتباس
ال-algorthem لا تصلح فيه فك أي شيء.

الـ algorithm تشرح كيفية تضمين البرنامج للـ prime factorization و هى تؤدى الغرض منها و تعمل جيدا مع الأرقام فى المدى من صفر و حتى أقصى رقم موجب يمكن تخزينه بـ signed long long طالما ان اقصى عدد أولي له لا يتجاوز اخر رقم اولي بالمصفوفه prime، و كلما كبر الرقم المدخل كلما زاد الوقت لحساب الـ factors و السبب هو انى صممت البرنامج للتسليه و ليس بإستخدام جدي. (ستجد انى صنعت مصفوفه للنتائج بحجم مصفوفة الـ primes و هذا اسلوب غير عملي)

اقتباس
Complicity بتعته كبيرة جدا

للأرقام الموجوده بالرابط الذى وضعته ستحتاج لـ algorithm مختلفه كثيرا عن المذكوره هنا و ذلك لكبر حجم هذه الأرقام و كمثال هذه الصفحه تحتوى على أله حاسبه تعطيك الـ factors لأى رقم تصل عدد خاناته إلى 20 فى اقل من الثانيه و على اسوء الظروف بضع دقائق.

ملحوظه: وجدت خطأ فى الداله isPrime الموجوده بالبرنامج prime_gen المسئول عن بناء المصفوفه primes و قمت بتحديث المرفقات.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 10 أغسطس 2011 في 05:03

مدونتي: C++ Tips and Tricks

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