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

خطوات الوصول إلى الرقم 43112609^2

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

لنبدأ اليوم بإذن الله تعالى بـــــ:

الخطوات العامة للوصول لهذا الرقم :

2^43112609

ملاحظة : هذه الخطوات مطبقة ( وتم إنجاز البرنامج لها)

البداية من الرقم واحد ..

ضرب الرقم واحد ب2 عدد من المرات وهو 43112609 مرة .........هذه هي الخطوط العريضة والواضحة

هذا الكلام البسيط .. يتضح عند بداية العمل عليه عدة مشاكل وأهمها :لا يمكن الوصول لأكثر من الرقم 2^64 بالطرق المعتادة وأقصد بذلك حلقة for تتكرر 43112609 مرة

وهي أول ما يتبادر للذهن في هذه الحالة ...

وكان أول حل لهذه المشكلة ..

(ملاحظة: من يود التفكير في الموضوع لا أنصحه بقراءة السطور التالية الآن.. )

الحل كان بمصفوفة : كل قيمها أصفار إلا القيمة الاخيرة هي 1

int number[size]={0,0,0,0,0,0,0..............,1};

والآن عندما نضرب ب 2 سنقوم بضرب عناصر المصفوفة بدءاً من اليسار ونضع شرط الضرب ( إذا كان العدد المضروب أكبر من 4 أضف واحد إلى العنصر السابق وخذ آحاد الناتج )

for(int i=1;i<size;i++)
{
if(number>4)number[i-1]++;//هذه عملية الحمل للمنزلة التالية
number*=2;//هنا عملية المضاعفة 
number%=10;//هنا نأخذ آحاد العدد وذلك في أي حال وبذلك سيكون كل عنصر هو احد منازل الرقم 
//ملاحظة : استعملنا هنا العد العشري .. ويمكن أن نعتمد أي نظام عد حتى نظام عد غير موجود سابقاً 
}

هذا الكود السابق يقوم بعملية المضاعفة مرة واحدة وفي حال أردنا القيام بذلك أكثر من مرة نضعه ضمن حلقة وهذا كل ما في الأمر

جسب هذا الحل يمكننا الوصول إلى 2^1000000 على الأقل وذلك خلال ساعة و 40 دقيقة حسب معالج 2.14 غيغا وهذه سرعة مقبولة ..

ولكن حتى هذا الرقم 2^ مليون لعبة أطفال أمام رقمنا 2^43مليون

......................

فكيف سنحل هذه المشكلة ....

هذه المشكلة تم حلها ونتابع في المرة القادمة بإذن الله تعالى

أنتظر تعليقاتكم وآراءكم وأفكاركم ..والسلام عليكم

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 6 أبريل 2012 في 17:54

3
#2

السلام عليكم

مرحباً بك أخى الكريم مصطفى وشاكر لك حماسك للموضوع , وفقك الله لما يحبه ويرضاه

بعض الملاحظات البسيطة من الممكن أن تفيدك قدماً فى موضوعك :

- طبعاً مدى المتغيرات المعرف مسبقاً فى اللغة لن يسعفك كثيراً فى تلك العمليات التى تتعامل مع هذه الأرقام الضخمة فعلى سبيل المثال أكبر مدى للأعداد الصحيحة فى لغة سي هو unsigned long long int والذى يبلغ مداه من 0 إلى 18,446,744,073,709,551,615

- يمكن لك إنجاز العمل ولكن عامل الوقت كما ذكرت من أهم العوامل فأقرب الطرق المتبعة فى هذا المجال هو تقسيم العمل على عدة أجهزة وبالتالى يقل الزمن بقدار قسمة الزمن المطلوب لإنتاج الرقم على عدد الأجهزة إن كانت تمتلك نفس سرعة المعالج , إذا لتوفير الوقت سوف تحاول إيجاد فكرة برنامج عمل جماعى لتقسيم العمل على عدة أجهزة .

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

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#3
اقتباس
هذه المشكلة تم حلها ونتابع في المرة القادمة بإذن الله تعالى

أنتظر تعليقاتكم وآراءكم وأفكاركم ..والسلام عليكم

1+

ممتاز أخى واصل نحن نتابعك

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4

السلام عليكم

اولاً جزاكم الله خيراً على متابعة الموضوع .. أما بعد :

أخي أحمد .. بالنسبة لفكرة نوع المتغير unsigned long long int لم أسمع بوجود شيء مثل هذا .. وهو كما تفضلت قليل بالنسبة لما نحتاجه ..

وشكراً لمتابعتك والأخ AudaNix أنتظر مشاركتك بفكرة ثورية المرة القادمة ...

بالنسبة لموضوعنا .. وحل المشكلة :

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

على أي حال : كان حل الفكرة هو بتخزين الرقم المعالج في ملف خارجي ثم اخذ جزء من الرقم ( من يسار الرقم نبدأ باتجاه اليمين) نعالج هذا الجزء ثم نكتب ناتج المعالجة في ملف آخر ..

ونكرر عملية استيراد أجزاء من الرقم وكتابة الناتج في ملف آخر حتى الوصول إلى نهاية الرقم ..

وبذلك نصل إلى مضاعفة رقم مهما كان حجمه ( تخطينا الحدود )..

هذه هي الفكرة ... وأنتظر رأيكم فيها ... بل وأنتظر إبداعاتكم في تحليل وتركيب الأكواد ...

في الختام إليكم بعض الملاحظات :

1-طبعاً سنبدأ من الرقم واحد ..

2-حسب ما قمت به .. وضعت حرف e في آخر الرقم للدلالة على الوصول إلى نهاية الرقم .. حتى أتجنب بعض الأخطاء في الدالة

 eof();

3-أصعب ما واجهته كان عملية الحمل حيث لا يمكننا تغيير رقم قمنا بكتابته .. لذلك : احتفظ بآخر رقم حتى تعالج الذي بعده ..

وأخيراً لا تنسى أن عمليتي القراءة والكتابة ستكون متتابعة بمعنى أننا سنكتب بمجرد ان ننتهي من المعالجة .. لكل جزء من الرقم ..

أترككم منتظراً بعض الاكواد والأفكار ..

بعد يومين او ثلاثة إن شاء الله ننهي هذاه الخطوة تماماً ...

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

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

#5

السلام عليكم

اقتباس
أخي أحمد .. بالنسبة لفكرة نوع المتغير unsigned long long int لم أسمع بوجود شيء مثل هذا ..

يمكنك الإطلاع على حدود تعريف المتغيرات من هذه الروابط

http://msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.80%29.aspx

http://cubicspot.blogspot.com/2009/03/unsigned-long-long-long-long-long-int.html

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#6

أنواع بيانات سي++ الاساسية الموجود بداخل مكتبة سي++ القياسية بصورة كامل وواضحة ومبسطة للجميع

http://en.cppreference.com/w/cpp/language/types

تقبل مرورى والله ولى التوفيق.

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#7

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

يمكن استخدام قوانين الأسس فى تبسيط القيمه المدخله و سنحتاج القواعد التاليه:

p><p>

وبالتالي:

p><p>

اعتقد ان حظنا جيد لوجود الرقم 2 كأساس و السبب يرجع إلى أن الرقم 2 يحجز مساحة 1 بت فقط و بالتالي عندما يكون الأس من مضاعفات الرقم 2 فهذا يعني أن عدد البتات المستهلكه تساوى ذلك الأس و لهذا السبب أخترت الرقم 16 فى المعادله السابقه.

يمكن الأن البدء فى عملية الضرب و حساب القيمه او يمكن إجراء بعض التحسينات قبل عملية الضرب.

لي عودة.

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

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 12 أبريل 2012 في 11:05

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

#8

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

جزاكم الله خيرا على المتابعة ... أما بعد :

أخي أحمد ... كنت على حق في موضوع المتحول من النوع long long وإنما كانت عدم معرفتي به لقصور علمي به.. فجزاك الله خيراً..

وكذلك الأخ AudaNix مرورك أخي أنس وارتياح لي بأن الموضوع لم يكن بلا قيمة ...

وشكراً للأخ علاء الدين على مروره ولكن أود أن أذكره بأول نصائح هذه المغامرة والتي كانت في المشاركة الأولى :

اقتباس
أما ما أنصحك به بعد التوكل على الله تعالى :

1-فكر بتجرد لأنه لن يفيدك دوال خارجية أو حتى أنواع متغيرات المعروفة ... ولا يوجد من سيعطيك الحل جاهزاً ولا جزءاً منه ... إلا بمقدار جديتك في العمل

2-اكتب الخوارزمية (خطوات الحل) بشكل عام .. ثم فصل إلى أن تصل لكل جزء برمجي على حدة

3-اختبر كل جزء برمجي على حدة على أرقام صغيرة بحيث يمكنك تنفيذه على الاقل على 100 منزلة لأن تعاملنا كله مع الأرقام الهائلة الحجم

وجزاكم الله خيراً ...

ان كان الموضوع يجب أن يسير ببطء فلا بأس .. ولكن المتابعة السريعة أفضل ...

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

يطلب منك إدخال القوة المطلوب الوصول إليها ..

ثم حجم الرقم ( عدد المنازل ) (( لا يمكن تجاوز ال 1000000 رقم تقريباً))

ثم إن كنت تريد ان يظهر تقدمه في العمليات ام لا .. 1 او 0

وأثناء تشغيل البرنامج في حالة عدم إظهار النتائج بشكل مستمر .. يمكنك ضغط b لإظهار القوة التي وصل إليها ويستمر ..

ويمكنك ضغط space لإظهار الوقت المار منذ البدء بالms

وللخروج أثناء العمل اضغط a

وعندما ينتهي البرنامج فسيحفظ الرقم الناتج تلقائياً في ملف يمكن فتحه بصيغة txt

هذا البرنامج ... له هدفان ..

الأول .. لإعلام من يتابع الموضوع متأخراً أين وصلنا ...

الثاني .. لعرض التقدم الذي وصلنا إليه لمن يتابع الموضوع ..

أخيراً المصدر ليس محفوظاً .. وأود نشره بالفعل ولكن ... أنتظر أفكاركم ... فالموضوع تبادل معرفة ..

وحتى الآن لم نتشارك بأفكار حقيقية رغم معرفتي الاكيدة بأنكم أغزر علماً وأكثر فهماً ..

جزاكم الله خيراً وإليكم البرنامج والسلام عليكم ...

work harder men.rar

#9

السلام عليكم

وأنا أكتب فى الرد فصلت الكهرباء smile.gif سأعاود كتابته فى إختصار ...

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

- وفعلاً كما قال أخى محمد من حسن الحظ اننا نتعامل مع العدد 2 كأساس , وهذا ما جعلنى أضع تلك الطريقة وهى :

- مثال لنحسب قيمة 8^2 وهو مضاعفات العدد 2 تكون على الشكل التالى :

الأس >>>>> حاصل جمع قيمة الأس السابق مع نفسه

2 >>>>>>> 2+2=4

3 >>>>>>> 4+4=8

4 >>>>>>> 8+8=16

5 >>>>>>> 16+16=32

6 >>>>>>> 32+32=64

7 >>>>>>> 64+64=128

8 >>>>>>> 128+128=256

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

- وبما أننا نريد الوصول لقيمة أكبر من عدد ميرسن وهو 1 - 43112609^2 فأول عدد من نوع ميرسن تالى لهذا الرقم هو 1 - 43112621^2

فلماذا نبدأ العملية من البداية فقط ما نحتاجه هو البدأ من الرقم 43112609^2 وبسهولة سنصل للرقم 43112621^2 حيث أن الرقم الأول معلوم ويبلغ عدد منازلة 12978189 .

- قمت بتنزيل العدد لكى أبدأ العمل عليه , طبعاً العدد ضخم حجمه مضغوط حوالى 6 ميجا , العدد هو ناتج 1 - 43112609^2 إذاً قم بزيادة 1 عليه ليكون هو ناتج 43112609^2 لكى أبدأ تطبيق ما تم شرحة عليه .

- وهذا هو ناتج الرقم 43112621^2

رابط تنزيل الرقم على الرابيد شير

طبعاً سنطرح من الرقم 1 ليعطينا عدد ميرسن الذى " إحتمال يكون عدد أولى "

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

- عذراً لكتابة الكود بلغة php فى قسم السي++ "لم أدرس السي++ حقيقاً laugh.gif" عموماً على إعتبارة بيزيدو كود happy.gif وإن شاء الله سأحاول تحويل البرنامج للغة السي++ لو سمح لى الوقت .

- وضعت شرح داخل الكود لتتبع مسار عمل الكود .

- تنزيل كود التطبيق

2^PN-1.rar

طبعاً التطبيق يحتاج لسرفر محلى لكي تستطيع تشغليه على المتصفح .

- يحتاج البرناج 45 ثانية تقريباً لإنتاج رقم فى حدود الرقم الحالى , يمكن تقلص هذا الوقت فيما لاحقاً لأننى أستخدم حلقة إضافية لعكس الرقم " سيتضح هذا من الشرح داخل الكود " وأيضاً لغة php لديها قيود على إستخدام موارد الجهاز لم أغير فيها شيئ .

بعد تنزيل ملف الرقم 43112621^2 قم بفك الضغط وأستبدله بالملف الفارغ فى البرنامج لكى يعمل البرنامج من هذا الرقم " فصلته عن البرنامج لكبر حجمه " .

والسلام عليكم

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#10

كما ذكرت من قبل يمكن اجراء تحسينات قبل البدء فى عملية حساب القيمه النهائيه كالتالي:

1- في مثل هذه الظروف سنجد ان اغلب المبرمجين سيقوموا بحساب قيمة العدد mimetex.cgi?2 \vspace* * \vspace* 65536^ و هذا خطأ حيث يوجد اختصار لمثل هذه العمليه و يتم فى اقل من الثانيه و لكن لتفهمه دعنا نأخذ مثال مبسط.

التكلم بالصيعه العشريه للأرقام ذات الأساس 2 تجعل الحياه صعبه لذا بدلا من ان نتكلم بالثنائي سنتكلم بصيعة السداسي عشرى.

نفترض ان لدينا الرقم 216 و نريد الحصول على قيمته لذا بتنفيذ جملة for ينتج لنا الرقم 1000016 و لكننا نعلم ان عملية ضرب الرقم 2 فى نفسه عدد من المرات هى نفسها عملية ازاحة الرقم 1 لليسار بمقدار ذلك الرقم أى أن mimetex.cgi?2^{16} \vspace* =  \vspace* و النتيجه ستكون نفسها.

كما نرى من الرقم 1000016 أنه يتكون من 3 بايت الأول و الثاني بقيمة صفر و الأخير بقيمة 1 و بالتالي إذا إذا قمنا بحجز مساحة 4 بايت من الذاكره فإن النصف الأول سيحتوى على 0 فقط أما الأخير فسيحتوى على 1. دعني أصيغها بشكل أخر، إذا كان الأس يمثل مساحة نوع معين - 16 فى حالتنا هذه - فإننا نحتاج على الأقل مساحتين من ذلك النوع الأولي تحتوى على صفر و الأخيره تحتوى على 1، هذه النتيجه لها العديد من التفسيرات منها إزاحة الرقم 12 بمقدار 16 بت لليسار لينتج لنا الرقم 100000000000000002 و حيث ان كل 4 بت تمثل رمز واحد بالنظام السداسي عشرى لذا تكون النتيجه هى 1000016.

طريقه أخرى لشرح هذه العمليه: تخيل ان لديك 16 بت و قمت بجعل قيمة كل بت بواحد حينها النتيجه ستكون FFFF16 و لكن الأن ينقصنا إضافة قيمة العدد 20 - و هي 1 - للناتج لذا تصبح النتيجه 1000016.

الهدف من كل هذا هو أن الرقم 655362694538 يمكن الحصول على ناتجه بخطوه واحده فقط حيث إذا نظرنا للرقم 65536 بالنظام السداسي عشرى سنجده 1000016 و هذا يعنى ان لدينا 2694538 متغير من نوع unsigned short بقيمة صفر و متغير واحد من نوع unsigned short موجود بأقصي اليسار بقيمة 1 و حيث انه يوجد الرقم 2 ليتم ضرب الناتج به - راجع المعادله الموجوده بأول هذه المشاركه - لذا يصبح المتغير الموجود بأقصي اليسار بقيمة 2 و بهذا نكون حصلنا على قيمة 243112609 برمجيا و لازالت دلينا الخطوه الأخيره لتحويل قيمة هذا الرقم لنص.

#include <limits.h>
#include <string.h>

typedef unsigned int uint32;

int main()
{
    const uint32 user_power = 43112609;

    const uint32 pwr = user_power/(sizeof(uint32) * CHAR_BIT);
    const uint32 rem = 1 << (user_power - pwr * sizeof(uint32) * CHAR_BIT);

    const uint32 arrLen = pwr + 1;

    uint32 *final_value = new uint32[arrLen];

    memset(final_value,0,arrLen* sizeof(uint32));

    final_value[arrLen-1]=rem;

    return 0;
}

قم بتغيير قيمة الثابت user_power للقيمة التى تريدها، لاحظ اني قمت بإستخدام النوع unsigned int بدلا من unsigned short، أيضا كي يعمل الكود كما هو متوقع منه أجعل قيمة الثابت user_power أكبر من أو تساوى sizeof(unsigned) * CHAR_BIT

لي عوده لتحسينات التحويل للنص.

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

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 15 أبريل 2012 في 22:34

2

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

#11

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

ما شاء الله عليكم شباب ... حماس رائع يدعو للتفاؤل بالمستقبل ...

أخي أحمد ما شاء الله عليك تفكيرك صحيح و رائع ويبدو انك منسجم مع الفكرة تماما وأنت من دلّنا عليها منذ البداية ... فجزاك الله كل خير ..

أما بعد ... شكراً لك على تنزيل الرقم هنا وعلى برنامجك أيضاً...

وبالنسبة لفكرة البدء من الرقم الأخير ثم المتابعة قهي بالتأكيد أفضل من البدء من الصفر ...

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

لا أظن أنك وجدت صعوبة في كتابة الكود السابق .. بل أجزم بأنك استمتعت اثناء كتابة خوارزمية برنامجك ...

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

اقتباس
- وبما أننا نريد الوصول لقيمة أكبر من عدد ميرسن وهو 1 - 43112609^2 فأول عدد من نوع ميرسن تالى لهذا الرقم هو 1 - 43112621^2

لا حظ اننا سنقوم ب 20 عملية مضاعفة و 30 و 40 ... وربما نضطر إلى المضاعفة أكثر مليون مرة وربما عشر ملايين

خصوصاً عندما تعرف أن رقم الميرسن الذي قبل هذا الرقم كان القوة 42643801 للرقم 2 (-1 طبعاً)

لذلك رأيت أيضاً أن الوصول إلى الرقم بدءاً من الواحد يُهمل أمام الوصول إلى الرقم الذي بعده ... ( طبعاً هو لا يُهمل ... بل يوفّر أكثر من نصف الطريق ) وعلى أي حال

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

أستاذي الكريم محمد علاء الدين

كلامك صحيح تماماً ...

وحتى لو أردنا كتابة الرقم بالنظام الثنائي .. فإن الأمر لن يتجاوز كتابة الرقم 1 43112609 مرة

ولكن لتحويل هذا الرقم عشرياً فإن الموضوع سيكون مأساوياً حيث سنضطر للقيام بما كنا سنقوم به لو أوجدنا الرقم عشرياً أكثر من مئة مرة أي أننا بدل أن نصل إلى القوة 43112609

يجب أن نوجد كل القوى السابقة ونجمعها ...

إذاً ... الهدف ليس إيجاد معرفة الرقم وحسب ... بل وجوده بالشكل العشري ...

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

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

إذاً بقي علينا إيجاد الخوارزمية اللازمة لاختبار رقم بهذا الحجم هل هو أولي ؟؟

وإليكم الخطوات ...

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

مثلاً : لاختبار الرقم 49 هل هو أولي أم لا ...

أولاً نوجد جذره : 7

ثانياً : نوجد الأعداد الأولية الأصغر أو تساوي جذره 2و3و5و7

ثالثاً : نوجد باقي القسمة على 2 ثم 3 ثم 5 ... هل يساوي 0 .. لا نختبره على 7 الباقي 0 إذاً فهو ليس أولي ...

هناك طريقة أخرى بالعكس ..

فوراً نختبره على الأرقام الأولية منذ البداية وعند كل رقم نختبر قابلية القسمة ...

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

مثال : نختبر الرقم 53

على 2 و 3 و 5 و 7 لايقبل القسمة ونلاحظ أن 7*7 هو 49 إذا يجب الاستمرار

هل يقبل على 11 لا ولكن 11*11 هو 121 وهو أكبر من الرقم الهدف 53 لذلك نتوقف ونعتبره أولياً ..

////////////

هذا بشكل عام ..

ونلاحظ أن العمليات هي :

1-إيجاد الأعداد الأولية من البداية( وهنا سنستخدم العودية بحيث أن إيجاد عدد اولي أكبر من الحد سيتطلب القيام بالخطوات نفسها وهذا هدفنا أصلا)

2-قابلية القسمة

3-التربيع أو الجذر ( حسب الطريقة المستخدمة )

إذا الهدف القادم هو تعريف عملية قابلية القسمة لعدد من 100 منزلة

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

أكرر شكري لكما أستاذ محمد علاء الدين والأخ أحمد سعود وكل المتابعين .. وأعتذر على الـتأخر في الرد لعدم توفر الانترنت في المنزل

وأعتذر بشدة على الإطالة ..

جزاكم الله خيراً والله ولي التوفيق

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

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

1
#12

السلام عليكم

شكراً أخى الكريم

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

أخى الكريم البرنامج يبدأ من البداية فقط ضع رقم 2 فى ملف LNF.txt وسمى الملف الآخر P-2^2.txt وضع به الرقم 4 , ولكن لتوفير الوقت

بالنسبة لخوارزمية التحقق من رقم كهذا سنقسم على أرقام ضخمة وتتبع الأرقام الأولية من البداية أمر صعب , وإن أردنا فعل هذا فيتثنى لنا تخزين الأعداد الأولية التى تحصلنا عليها فى ملفات خارجية للقسمة عليها فيما بعد , وهذا أمر غير عملى .

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

يبدوا أنك لم تجرب البرنامج

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 17 أبريل 2012 في 21:07

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#13

موضوع العدد الأولي لم يكن ضمن محتوى المشاركه الأولي حيث ان الهدف الأساسي كما قيل هو الحصول على الرقم 2 مرفوعا للأس 43112609.

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

بالمرفقات الكود الخاص بالحصول على الرقم محور المناقشه و يتم حفظ الناتج بالنظام العشرى داخل ملف بمجلد المشروع، عملية التحويل الناتج لنص استغرقت مقدار ساعه و 25 دقيقه و 34 ثانيه بوضع الإعدادات لنسخة Release و بدون استخدام Enhanced Instruction Set و عند استخدام SSE2 و تفعيل بعض التحسينات بالمترجم ينتج الملف فى خلال ساعه و 28 ثانيه. جهازى به معالج Dual Core 3.4 و ذاكره 4 جيجا.

البرنامج يقوم بالحصول على الرقم 2 مروفعا للأس مليون فى وقت 26 ثانيه بدون اى تحسينات و 19 ثوان بإستخدام التحسينات.

سبب الوقت الطويل الذى تحتاجه عملية التحويل لنص يكمن فى الكيفيه التى تعمل بها الداله div - راجع كود الفئه power_2 - و كنت اريد السعي لتحسينها و لكن لا يوجد وقت لدى و ايضا اتضح ان هذا الأمر ليس الهدف الأساسي لذا أرجو لمن يرغب كامل الإستفاده من الكود.

power_2.zip

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

1

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

#14

السلام عليكم

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

الجذر له " لم أجرب هذا فقط مجرد فكرة فمن الممكن يستغرق وقت طويل أيضاً ", ولن نحتاج لعملية التحويل للنظام العشرى إلا مرة واحدة بعد وجود الرقم المطلوب .

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#15

السلام عليكم

أخي أحمد أعتذر إن كانت عبارة

اقتباس
علينا إنهاء الخطوة التي نحن فيها
قد اعتبرتها انتقاصاً لمجهودك ... بل في الواقع

لقد جربت البرنامج وقد عمل كما قلت ... وإن شاء الله اليوم أحاول أن أحول الكود من php إلى c++ ولكن ما حدث هو أننا لم ننجز برنامجاً ذاتي الحركة كلياً ...

( رغم أن برنامجك كان قريباً جداً من هذه الخطوة)

حيث أن آلية عمله أن نضع في الملف LNF رقم الأس الذي سينطلق منه ونسمي الملف الحاوي على الأس الذي سنبدأ منه P-2^الأس الذي سنبدأ منه

وهذا يؤدي إلى عملية مضاعفة واحدة فقط .. وربما يمكننا حل المشكلة بكتابة برنامج يشغل برنامجك عدداً من المرات حسب النتيجة التي نود الحصول عليها

فان استطعت تجاوز هذه الخطوة يكون برنامجك قد اكتمل وحقق المطلوب تماماً .... فجزاك الله خيراً ...

أستاذنا الفاضل محمد .. لو تتكرم علينا بوضع الملف التنفيذي فقد احترت في ترجمة المصدر ... و بالنسبة لهدف الموضوع ... أعتذر عن سوء التفاهم ظننت انك قرأت الموضوع الاول

اكيفية الوصول إلى أكبر رقم أولي

أكرر اعتذاري وأشكرك شكراً جزيلا على مجهودك ... وننتظر ان تستلم الموضوع فأنت أهل الحل والعقد هنا ... جزاك الله خيراً ..

لتفادي اضاعة الوقت ... خلاصة ما نود انتاجه ... برنامج ( يمكنه ان أردنا ) أن يبدا من الواحد وينتهي بأي قوة نريدها (وحاليا 43112609 ثم 431126121 وهكذا الى ان نصل الى رقمنا المرتجى)

مهما بلغ الوقت اللازم لذلك حتى لو 10 أيام ... وطبعاً كلما كان البرنامج أسهل بالتعامل وأقصر باستهلاك الوقت كان افضل .. المهم امكانية التنفيذ ..

يبدو أن الموضوع قد صار جدياً بالنسبة لكم ... أرجو ان يكون مفيداً وليس مجرد اضاعة وقت ...

وجزاكم الله خيراً والسلام عليكم ورحمة الله وبركاته ..

#16

السلام عليكم

اقتباس

حيث أن آلية عمله أن نضع في الملف LNF رقم الأس الذي سينطلق منه ونسمي الملف الحاوي على الأس الذي سنبدأ منه P-2^الأس الذي سنبدأ منه

وهذا يؤدي إلى عملية مضاعفة واحدة فقط .. وربما يمكننا حل المشكلة بكتابة برنامج يشغل برنامجك عدداً من المرات حسب النتيجة التي نود الحصول عليها

فان استطعت تجاوز هذه الخطوة يكون برنامجك قد اكتمل وحقق المطلوب تماماً .... فجزاك الله خيراً ...

الأمر بسيط , وكما قلت أن لغة php لها قيود على استخدام موارد الجهاز وهذا ما جعلنى لا أضع حلقة مفتوحة لعمل البرنامج , عموماً أزلت شرط وقت عمل السكريبت وجعلته مفتوح , وجعلت البرنامج يكتب على نفس الملف لتوفير مساحة الهارد ديسك وعدم كثرة الملفات الناتجة من البرنامج .

إليك البرامج بعد التعديل

2^PN-1.rar

دمتم بخير

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#17

أخي أحمد قمت بإضافة حلقة for إلى برنامجك فصار يؤدي المطلوب تماماً .. وليس حلقة مفتوحة فأرجو ان يعجبك عمله الآن ..

إلا أنني استغربت عمله حيث يقوم بحفظ الرقم في المتحول txtOutx وهذا يعني ان حجم هذه المصفوفة سيصل إلى 13 مليون بايت فكيف استطاع الجهاز حجم هذا الحجم في الرام ؟؟

على كل حال أظن أنه أصبح كاملاً الآن ويحقق المطلوب نماماً ... ولكنني أظن ان تحويله إلى c++ سيؤدي إلى تغييره بشكل كامل .. حيث أننا سنستعمل مكدس حتى نستعمل شكل مكافئ لعملية النقطة في php

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

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

اليك البرنامج

2^PN-1.rar

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 20 أبريل 2012 في 17:38

1
#18

أما بالنسبة إلى محاولتي في الموضوع وهو برنامج مضى عليه حوالي شهرين منذ كتابته ...

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

شكراً للمتابعة.rar

يحتاج إلى بعض الرتوش .. النهائية ..

إن كانت المصادر تحتاج إلى شرح .. فخلال يومين يكون مشروحاً .. إن شاء الله

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

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

#19

السلام عليكم

اقتباس

أخي أحمد قمت بإضافة حلقة for إلى برنامجك فصار يؤدي المطلوب تماماً .. وليس حلقة مفتوحة فأرجو ان يعجبك عمله الآن ..

رائع يبدو أنك بدأت التعامل مع php smile.gif سؤال ما رآيك بها ؟

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

وأيضاً ماذا لو قمت بتشغيل الملف أكثر من مرة سيقوم فى كل مرة عمل دورات مساوية لعدد نهاية حلقة for وسوف يتعدى الرقم المطلوب .

- تفضل هذا التعديل الذى يسمح لك بتشغيل البرنامج أكثر من مرة للوصول للعدد المطلوب لأن البرنامج سيأخذ وقت كبير فى الوصول للأعداد ذات الأسس المليونية فغير معقول أن تترك الجهاز يعمل حتى ينهى الوصول للرقم .

فقط ضع الأس المراد الوصول إليه فى الملف To^PN.txt

تنزيل الكود

P-2^PN.rar

اقتباس

إلا أنني استغربت عمله حيث يقوم بحفظ الرقم في المتحول txtOutx وهذا يعني ان حجم هذه المصفوفة سيصل إلى 13 مليون بايت فكيف استطاع الجهاز حجم هذا الحجم في الرام ؟؟

لهذا قمت بتعديل الذاكرة التى يتعامل معها السكريبت فى أول الكود لأن الإعدادت الإفتراضية للغة لا تسمح بالتعامل مع تلك المتغيرات كبيرة الحجم والوقت الطويل الذى تتطلبة معالجة هذة الأحجام .
اقتباس
ولكنني أظن ان تحويله إلى c++ سيؤدي إلى تغييره بشكل كامل .. حيث أننا سنستعمل مكدس حتى نستعمل شكل مكافئ لعملية النقطة في php
استخدم مكتبات التعامل مع النصوص

دمت فى رعاية الله

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…