সংক্ষিপ্তসার সম্পাদনা করুন
- আমার মূল উত্তরটি কেবলমাত্র উল্লেখ করেছে যে কোডটিতে অনেকগুলি প্রতিলিপিযুক্ত গণনা রয়েছে এবং অনেকগুলি ক্ষমতা 1/3 এর সাথে জড়িত। উদাহরণস্বরূপ,
pow(x, 0.1e1/0.3e1)
হিসাবে একই cbrt(x)
।
- আমার দ্বিতীয় সম্পাদনাটি কেবল ভুল ছিল এবং আমার তৃতীয়টি এই অন্যায়টি নিয়ে প্রকাশিত হয়েছিল। এটিই লোকজনকে 'এম' অক্ষর দিয়ে শুরু হওয়া প্রতীকী গণিত প্রোগ্রামগুলি থেকে ওরাকলের মতো ফলাফলগুলি পরিবর্তন করতে ভয় করে। আমি সেগুলি সম্পাদনা করেছি (অর্থাত্
ধর্মঘট ) এবং এগুলি এই উত্তরটির বর্তমান সংশোধনের নীচে নিয়ে এসেছি । তবে আমি সেগুলি মুছলাম না। আমি মানুষ. আমাদের পক্ষে ভুল করা সহজ।
- আমার চতুর্থ সম্পাদন করা একটি খুব কম্প্যাক্ট অভিব্যক্তি যে সঠিকভাবে প্রশ্নে সংবর্ত অভিব্যক্তি প্রতিনিধিত্ব করে উন্নত যদি পরামিতি
l1
, l2
এবং l3
ইতিবাচক বাস্তব সংখ্যা এবং যদি a
একটি নন-জিরো বাস্তব সংখ্যা। (এই গুণাগুণগুলির নির্দিষ্ট প্রকৃতি সম্পর্কে আমরা এখনও ওপি থেকে শুনতে পাইনি the সমস্যার প্রকৃতি প্রদত্ত, এগুলি যুক্তিসঙ্গত অনুমান)
- এই সম্পাদনাগুলি কীভাবে এই অভিব্যক্তিগুলি সরল করতে পারে তার জেনেরিক সমস্যার উত্তর দেওয়ার চেষ্টা করে।
আগেরটা আগে
আমি ভুল এড়াতে সি ++ কোড উত্পন্ন করতে ম্যাপেল ব্যবহার করি।
ম্যাপেল এবং ম্যাথমেটিকা কখনও কখনও স্পষ্টভাবে মিস করে। আরও গুরুত্বপূর্ণ বিষয়, ম্যাপেল এবং ম্যাথমেটিকার ব্যবহারকারীরা কখনও কখনও ভুল করেন। "প্রায়শই সময়", অথবা "প্রায় সবসময়" এর পরিবর্তে "কখনও কখনও" চিহ্নের কাছাকাছি চলে আসে।
আপনি ম্যাপেলকে প্রশ্নের মধ্যে থাকা প্যারামিটারগুলি বলার মাধ্যমে এই অভিব্যক্তিটি সহজতর করতে সহায়তা করতে পারেন। হাতের উদাহরণে, আমি সন্দেহ করি যে l1
, l2
এবং l3
এটি ইতিবাচক আসল সংখ্যা এবং এটি a
একটি শূন্য-আসল সংখ্যা। যদি ঘটনাটি হয় তবে তা বলুন। এই প্রতীকী গণিত প্রোগ্রামগুলি সাধারণত হাতের পরিমাণগুলি জটিল বলে ধরে নেয়। ডোমেনকে সীমাবদ্ধ করা প্রোগ্রামটিকে এমন অনুমানগুলি তৈরি করতে দেয় যা জটিল সংখ্যায় বৈধ নয়।
প্রতীকী গণিত প্রোগ্রামগুলি থেকে কীভাবে এই বড় মেসগুলি সরল করা যায় (এই সম্পাদনা)
প্রতীকী গণিত প্রোগ্রামগুলি সাধারণত বিভিন্ন পরামিতি সম্পর্কে তথ্য সরবরাহ করার ক্ষমতা সরবরাহ করে। সেই ক্ষমতাটি ব্যবহার করুন, বিশেষত যদি আপনার সমস্যায় বিভাজন বা ক্ষয়ক্ষতি জড়িত। হাতে উদাহরণে, আপনি Maple এটা কহন যে যে অভিব্যক্তি প্রক্রিয়া সহজ করেছে থাকতে পারে l1
, l2
এবং l3
হয় ইতিবাচক বাস্তব সংখ্যা এবং যে a
একটি নন-জিরো বাস্তব সংখ্যা। যদি ঘটনাটি হয় তবে তা বলুন। এই প্রতীকী গণিত প্রোগ্রামগুলি সাধারণত হাতের পরিমাণগুলি জটিল বলে ধরে নেয়। ডোমেইন সীমাবদ্ধ যেমন একটি প্রোগ্রাম করতে অনুমানের দেয় এক্স খ এক্স = (AB) এক্স । এটি কেবলমাত্র যদি a
এবং b
ইতিবাচক বাস্তব সংখ্যা এবং যদি x
বাস্তব হয়। জটিল সংখ্যায় এটি বৈধ নয়।
শেষ পর্যন্ত, এই প্রতীকী গণিত প্রোগ্রামগুলি অ্যালগরিদমগুলি অনুসরণ করে। এটি বরাবর সাহায্য করুন। আপনি কোড উত্পন্ন করার আগে প্রসারিত, সংগ্রহ এবং সরলকরণের সাথে খেলতে চেষ্টা করুন। এই ক্ষেত্রে, আপনি কোনও পদার্থ mu
এবং কোনও ফ্যাক্টরের সাথে জড়িত শর্তাদি সংগ্রহ করতে পারতেন K
। তার "সর্বাধিক সরল রূপ" এ একটি ভাব হ্রাস করা একটি শিল্পের কিছুটা অবশেষ।
আপনি যখন উত্পন্ন কোডটির একটি কুৎসিত জগাখিচুড়ি পান, তখন এটি এমন সত্য হিসাবে গ্রহণ করবেন না যে আপনাকে অবশ্যই স্পর্শ করবেন না। এটিকে নিজেই সরল করার চেষ্টা করুন। প্রতীকী গণিত প্রোগ্রামটি কোড তৈরি করার আগে কী ছিল তা দেখুন। আমি কীভাবে আপনার প্রকাশকে আরও সহজ এবং দ্রুততর কিছুতে হ্রাস করেছি এবং ওয়াল্টারের উত্তর কীভাবে আমার বেশ কয়েক পদক্ষেপ নিয়েছিল তা দেখুন। কোনও যাদু রেসিপি নেই। যদি কোনও মায়াবী রেসিপি থাকে তবে ম্যাপেল এটি প্রয়োগ করে ওয়াল্টার যে উত্তরটি দিয়েছিলেন তা দিয়ে দিতেন।
নির্দিষ্ট প্রশ্ন সম্পর্কে
আপনি সেই গণনায় প্রচুর সংযোজন এবং বিয়োগফল করছেন। একে অপরের বাতিল করার শর্তাদি থাকলে আপনি গভীর সমস্যায় পড়তে পারেন। আপনার যদি এমন একটি শব্দ থাকে যা অন্যদের উপর আধিপত্য করে তবে আপনি প্রচুর সিপিইউ নষ্ট করছেন।
এরপরে, আপনি বারবার গণনা করে প্রচুর সিপিইউ নষ্ট করছেন। আপনি সক্ষম না করা থাকলে -ffast-math
, যা সংকলকটি আইইইই ভাসমান পয়েন্টের কিছু বিধি ভাঙতে দেয়, সংকলকটি আপনার পক্ষে এই অভিব্যক্তিটি সহজতর করবে না (বাস্তবে, অবশ্যই তা নয়)। এটি পরিবর্তে আপনি যা করতে বলেছিলেন ঠিক তা করবে। সর্বনিম্ন, আপনার এই জগাখিচির গণনা করার l1 * l2 * l3
আগে হিসাব করা উচিত ।
অবশেষে, আপনি অনেক কল করছেন pow
, যা অত্যন্ত ধীর। নোট করুন যে এই কলগুলির মধ্যে বেশ কয়েকটি ফর্মের (l1 * l2 * l3) (1/3) । এই কলগুলির মধ্যে অনেকগুলি pow
একক কল দিয়ে সম্পাদিত হতে পারে std::cbrt
:
l123 = l1 * l2 * l3;
l123_pow_1_3 = std::cbrt(l123);
l123_pow_4_3 = l123 * l123_pow_1_3;
এর সাথে,
X * pow(l1 * l2 * l3, 0.1e1 / 0.3e1)
হয়ে X * l123_pow_1_3
।
X * pow(l1 * l2 * l3, -0.1e1 / 0.3e1)
হয়ে X / l123_pow_1_3
।
X * pow(l1 * l2 * l3, 0.4e1 / 0.3e1)
হয়ে X * l123_pow_4_3
।
X * pow(l1 * l2 * l3, -0.4e1 / 0.3e1)
হয়ে X / l123_pow_4_3
।
ম্যাপেল স্পষ্টতই মিস করেছে।
উদাহরণস্বরূপ, লেখার অনেক সহজ উপায় রয়েছে
(pow(l1 * l2 * l3, -0.1e1 / 0.3e1) - l1 * l2 * l3 * pow(l1 * l2 * l3, -0.4e1 / 0.3e1) / 0.3e1)
ধরে নিই যে l1
, l2
এবং l3
জটিল সংখ্যার চেয়ে বাস্তব এবং সত্যিকারের কিউব মূলটি (মূল নীতিটি জটিল মূলের চেয়ে) উত্তোলন করতে হবে, উপরেরটি হ্রাস পেয়েছে
2.0/(3.0 * pow(l1 * l2 * l3, 1.0/3.0))
বা
2.0/(3.0 * l123_pow_1_3)
cbrt_l123
পরিবর্তে ব্যবহার করে l123_pow_1_3
, প্রশ্নে দুষ্টু প্রকাশটি হ্রাস পায়
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T =
mu/(3.0*l123)*( pow(l1/cbrt_l123,a)*(2.0*N1-N2-N3)
+ pow(l2/cbrt_l123,a)*(2.0*N2-N3-N1)
+ pow(l3/cbrt_l123,a)*(2.0*N3-N1-N2))
+K*(l123-1.0)*(N1+N2+N3);
সর্বদা ডাবল চেক করুন, তবে পাশাপাশি সর্বদা সহজ করুন।
উপরের দিকে পৌঁছাতে আমার কয়েকটি পদক্ষেপ এখানে দেওয়া হল:
T=(mu*(pow(l1*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a*(pow(l1*l2*l3,-0.1e1/0.3e1)-l1*l2*l3*pow(l1*l2*l3,-0.4e1/0.3e1)/0.3e1)*pow(l1*l2*l3,0.1e1/0.3e1)/l1-pow(l2*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a/l1/0.3e1-pow(l3*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a/l1/0.3e1)/a+K*(l1*l2*l3-0.1e1)*l2*l3)*N1/l2/l3+(mu*(-pow(l1*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a/l2/0.3e1+pow(l2*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a*(pow(l1*l2*l3,-0.1e1/0.3e1)-l1*l2*l3*pow(l1*l2*l3,-0.4e1/0.3e1)/0.3e1)*pow(l1*l2*l3,0.1e1/0.3e1)/l2-pow(l3*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a/l2/0.3e1)/a+K*(l1*l2*l3-0.1e1)*l1*l3)*N2/l1/l3+(mu*(-pow(l1*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a/l3/0.3e1-pow(l2*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a/l3/0.3e1+pow(l3*pow(l1*l2*l3,-0.1e1/0.3e1),a)*a*(pow(l1*l2*l3,-0.1e1/0.3e1)-l1*l2*l3*pow(l1*l2*l3,-0.4e1/0.3e1)/0.3e1)*pow(l1*l2*l3,0.1e1/0.3e1)/l3)/a+K*(l1*l2*l3-0.1e1)*l1*l2)*N3/l1/l2;
l123 = l1 * l2 * l3;
T=(mu*(pow(l1*pow(l123,-1.0/3),a)*a*(pow(l123,-1.0/3)-l123*pow(l123,-4.0/3)/3)*pow(l123,1.0/3)/l1-pow(l2*pow(l123,-1.0/3),a)*a/l1/3-pow(l3*pow(l123,-1.0/3),a)*a/l1/3)/a+K*(l123-1.0)*l2*l3)*N1/l2/l3+(mu*(-pow(l1*pow(l123,-1.0/3),a)*a/l2/3+pow(l2*pow(l123,-1.0/3),a)*a*(pow(l123,-1.0/3)-l123*pow(l123,-4.0/3)/3)*pow(l123,1.0/3)/l2-pow(l3*pow(l123,-1.0/3),a)*a/l2/3)/a+K*(l123-1.0)*l1*l3)*N2/l1/l3+(mu*(-pow(l1*pow(l123,-1.0/3),a)*a/l3/3-pow(l2*pow(l123,-1.0/3),a)*a/l3/3+pow(l3*pow(l123,-1.0/3),a)*a*(pow(l123,-1.0/3)-l123*pow(l123,-4.0/3)/3)*pow(l123,1.0/3)/l3)/a+K*(l123-1.0)*l1*l2)*N3/l1/l2;
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T=(mu*(pow(l1/cbrt_l123,a)*a*2.0/(3.0*cbrt_l123)*cbrt_l123/l1-pow(l2/cbrt_l123,a)*a/l1/3-pow(l3/cbrt_l123,a)*a/l1/3)/a+K*(l123-1.0)*l2*l3)*N1/l2/l3+(mu*(-pow(l1/cbrt_l123,a)*a/l2/3+pow(l2/cbrt_l123,a)*a*2.0/(3.0*cbrt_l123)*cbrt_l123/l2-pow(l3/cbrt_l123,a)*a/l2/3)/a+K*(l123-1.0)*l1*l3)*N2/l1/l3+(mu*(-pow(l1/cbrt_l123,a)*a/l3/3-pow(l2/cbrt_l123,a)*a/l3/3+pow(l3/cbrt_l123,a)*a*2.0/(3.0*cbrt_l123)*cbrt_l123/l3)/a+K*(l123-1.0)*l1*l2)*N3/l1/l2;
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T =
(mu*( pow(l1/cbrt_l123,a)*a*2.0/(3.0*cbrt_l123)*cbrt_l123/l1
-pow(l2/cbrt_l123,a)*a/l1/3
-pow(l3/cbrt_l123,a)*a/l1/3)/a
+K*(l123-1.0)*l2*l3)*N1/l2/l3
+(mu*(-pow(l1/cbrt_l123,a)*a/l2/3
+pow(l2/cbrt_l123,a)*a*2.0/(3.0*cbrt_l123)*cbrt_l123/l2
-pow(l3/cbrt_l123,a)*a/l2/3)/a
+K*(l123-1.0)*l1*l3)*N2/l1/l3
+(mu*(-pow(l1/cbrt_l123,a)*a/l3/3
-pow(l2/cbrt_l123,a)*a/l3/3
+pow(l3/cbrt_l123,a)*a*2.0/(3.0*cbrt_l123)*cbrt_l123/l3)/a
+K*(l123-1.0)*l1*l2)*N3/l1/l2;
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T =
(mu*( pow(l1/cbrt_l123,a)*2.0/(3.0*cbrt_l123)*cbrt_l123/l1
-pow(l2/cbrt_l123,a)/l1/3
-pow(l3/cbrt_l123,a)/l1/3))*N1/l2/l3
+K*(l123-1.0)*l2*l3*N1/l2/l3
+(mu*(-pow(l1/cbrt_l123,a)/l2/3
+pow(l2/cbrt_l123,a)*2.0/(3.0*cbrt_l123)*cbrt_l123/l2
-pow(l3/cbrt_l123,a)/l2/3))*N2/l1/l3
+K*(l123-1.0)*l1*l3*N2/l1/l3
+(mu*(-pow(l1/cbrt_l123,a)/l3/3
-pow(l2/cbrt_l123,a)/l3/3
+pow(l3/cbrt_l123,a)*2.0/(3.0*cbrt_l123)*cbrt_l123/l3))*N3/l1/l2
+K*(l123-1.0)*l1*l2*N3/l1/l2;
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T =
(mu*( pow(l1/cbrt_l123,a)*2.0/3.0/l1
-pow(l2/cbrt_l123,a)/l1/3
-pow(l3/cbrt_l123,a)/l1/3))*N1/l2/l3
+(mu*(-pow(l1/cbrt_l123,a)/l2/3
+pow(l2/cbrt_l123,a)*2.0/3.0/l2
-pow(l3/cbrt_l123,a)/l2/3))*N2/l1/l3
+(mu*(-pow(l1/cbrt_l123,a)/l3/3
-pow(l2/cbrt_l123,a)/l3/3
+pow(l3/cbrt_l123,a)*2.0/3.0/l3))*N3/l1/l2
+K*(l123-1.0)*N1
+K*(l123-1.0)*N2
+K*(l123-1.0)*N3;
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T =
mu*( ( pow(l1/cbrt_l123,a)*2.0/3.0/l1
-pow(l2/cbrt_l123,a)/l1/3
-pow(l3/cbrt_l123,a)/l1/3)*N1/l2/l3
+ (-pow(l1/cbrt_l123,a)/l2/3
+pow(l2/cbrt_l123,a)*2.0/3.0/l2
-pow(l3/cbrt_l123,a)/l2/3)*N2/l1/l3
+ (-pow(l1/cbrt_l123,a)/l3/3
-pow(l2/cbrt_l123,a)/l3/3
+pow(l3/cbrt_l123,a)*2.0/3.0/l3)*N3/l1/l2)
+K*(l123-1.0)*(N1+N2+N3);
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T =
mu*( pow(l1/cbrt_l123,a)*2.0/3.0/l1*N1/l2/l3
-pow(l2/cbrt_l123,a)/l1/3*N1/l2/l3
-pow(l3/cbrt_l123,a)/l1/3*N1/l2/l3
-pow(l1/cbrt_l123,a)/l2/3*N2/l1/l3
+pow(l2/cbrt_l123,a)*2.0/3.0/l2*N2/l1/l3
-pow(l3/cbrt_l123,a)/l2/3*N2/l1/l3
-pow(l1/cbrt_l123,a)/l3/3*N3/l1/l2
-pow(l2/cbrt_l123,a)/l3/3*N3/l1/l2
+pow(l3/cbrt_l123,a)*2.0/3.0/l3*N3/l1/l2)
+K*(l123-1.0)*(N1+N2+N3);
l123 = l1 * l2 * l3;
cbrt_l123 = cbrt(l123);
T =
mu/(3.0*l123)*( pow(l1/cbrt_l123,a)*(2.0*N1-N2-N3)
+ pow(l2/cbrt_l123,a)*(2.0*N2-N3-N1)
+ pow(l3/cbrt_l123,a)*(2.0*N3-N1-N2))
+K*(l123-1.0)*(N1+N2+N3);
ভুল উত্তর, ইচ্ছাকৃতভাবে নম্রতার জন্য রাখা
নোট করুন যে এটি জড়িত। এটা ভুল.
হালনাগাদ
ম্যাপেল স্পষ্টতই মিস করেছে। উদাহরণস্বরূপ, লেখার অনেক সহজ উপায় আছে
(পাও (l1 * l2 * l3, -0.1e1 / 0.3e1) - l1 * l2 * l3 * পাও (l1 * l2 * l3, -0.4e1 / 0.3e1) / 0.3e1)
ধরে নিই যে l1
, l2
এবং l3
জটিল সংখ্যার চেয়ে বাস্তব এবং সত্যিকারের কিউব মূলটি (মূল নীতিটি জটিল মূলের চেয়ে) উত্তোলন করতে হবে, উপরেরটি শূন্যে হ্রাস পাবে। শূন্যের এই গণনাটি বহুবার পুনরাবৃত্তি হয়।
দ্বিতীয় আপডেট
আমি যদি গণিতটি সঠিকভাবে করে ফেলেছি ( কোনও অঙ্কের গ্যারান্টি নেই যে আমি গণিতটি সঠিকভাবে করেছি) তবে প্রশ্নের মধ্যে কদর্য ভাব কমিয়ে দেয়
l123 = l1 * l2 * l3;
cbrt_l123_inv = 1.0 / cbrt(l123);
nasty_expression =
K * (l123 - 1.0) * (N1 + N2 + N3)
- ( pow(l1 * cbrt_l123_inv, a) * (N2 + N3)
+ pow(l2 * cbrt_l123_inv, a) * (N1 + N3)
+ pow(l3 * cbrt_l123_inv, a) * (N1 + N2)) * mu / (3.0*l123);
উপরেরটি ধরে নেয় যে l1
, l2
এবং l3
ইতিবাচক বাস্তব সংখ্যা।
pow(l1 * l2 * l3, -0.1e1 / 0.3e1)
পরিবর্তনশীল সহ সমস্তগুলি প্রতিস্থাপন করা ... এটি দ্রুত বা ধীর গতিতে চলছে কিনা তা নিশ্চিত করার জন্য আপনার কোডটি বেনমার্ক করা উচিত though