প্রোগ্রাম লিখুন যা এরদেস – স্ট্রাস অনুমান যাচাই করে


15

প্রোগ্রাম লিখুন, যা এরদেস – স্ট্রাস অনুমানকে যাচাই করে
প্রোগ্রাম এক পূর্ণসংখ্যা ইনপুট হিসাবে গ্রহণ করা উচিত n( 3 <= n <= 1 000 000) এবং পরিচয় পরিতৃপ্ত পূর্ণসংখ্যার ট্রিপল প্রিন্ট 4/n = 1/x + 1/y + 1/z, 0 < x < y < z

সংক্ষিপ্ততম কোড জিতেছে।

কিছু উদাহরণ:

3 => {1, 4, 12}
4 => {2, 3, 6}
5 => {2, 4, 20}
1009 => {253, 85096, 1974822872}
999983 => {249996, 249991750069, 62495875102311369754692}
1000000 => {500000, 750000, 1500000}

নোট করুন যে আপনার প্রোগ্রামটি এই সংখ্যার জন্য অন্যান্য ফলাফল মুদ্রণ করতে পারে কারণ একাধিক সমাধান রয়েছে।


প্রোগ্রামটির প্রতিটি সম্ভাব্য সমাধান বা কেবল একটিই আউটপুট করা দরকার? উদাহরণস্বরূপ এন = 5 এর জন্য 2 সম্ভাবনা রয়েছে।
ইজলিন

1
কেবল একটিই যথেষ্ট।
সোমনিয়াম

2
এটি কিছুটা বিভ্রান্তিকর যে আপনার একমাত্র পরীক্ষার কেসটি অনুমান অনুসারে বৈধ ইনপুট নয়।
পিটার টেলর

আমি এটি পরিবর্তন করব, উদাহরণস্বরূপ durron597 যুক্ত হয়েছে।
সোমনিয়াম

আমি সেই উদাহরণটি যুক্ত করেছি কারণ আমার গবেষণা বলেছে যে এটি করা বিশেষত কঠিন। সবচেয়ে {1, 121, 169, 289, 361, 529}
কঠিনতমগুলি

উত্তর:


12

রুবি, 119 106 টি অক্ষর

f=->s,c,a{m=s.to_i;c<2?m<s||(p a+[m];exit):(1+m...c*s).map{|k|f[s/(1-s/k),c-1,a+[k]]}}
f[gets.to_r/4,3,[]]

কোডটি প্রতিটি ভেরিয়েবলের জন্য ন্যূনতম সীমা ব্যবহার করে, যেমন n/4<x<3n/4একইর জন্য y। এমনকি শেষ উদাহরণটি তাত্ক্ষণিকভাবে ফিরে আসে ( এখানে চেষ্টা করুন )।

উদাহরণ:

> 12
[4, 13, 156]

> 123
[31, 3814, 14542782]

> 1234
[309, 190654, 36348757062]

> 40881241801
[10220310451, 139272994276206121600, 22828913614743204775214996005450198400]

শীতল সমাধান, তবে সীমাটি কিছুটা কড়া, কারণ 1 000 000 এর জন্য আপনার প্রোগ্রামটি আরও বেশি সমাধান খুঁজে পায় (আমার উদাহরণ দেখুন)।
সোমনিয়াম

1
@ ব্যবহারকারী 2992539 আমার কোড অভিধানের প্রথম সমাধান (250001 <500000) প্রদান করে।
হাওয়ার্ড

7

গণিত 62

এই প্লেইন-ভ্যানিলা দ্রবণটি বেশিরভাগ সময় সূক্ষ্মভাবে কাজ করে।

f@n_ := FindInstance[4/n == 1/x + 1/y + 1/z && 0 < x < y < z, {x, y, z}, Integers]

উদাহরণ এবং সময় (সেকেন্ডে)

AbsoluteTiming[f[63]]
AbsoluteTiming[f[123]]
AbsoluteTiming[f[1003]]
AbsoluteTiming[f[3003]]
AbsoluteTiming[f[999999]]
AbsoluteTiming[f[1000000]]

{0.313671, {{x -> 16, y -> 1009, z -> 1017072}}}
{0.213965, {{x -> 31, y -> 3814, z -> 14542782}}
{0.212016, {{x -> 251, y -> 251754, z -> 63379824762}}}
{0.431834, {{x -> 751, y -> 2255254, z -> 5086168349262}}
{1.500332, {{x -> 250000, y - > 249999750052, z -> 1201920673328124750000}}}
{1.126821, {{x -> 375000, y -> 1125000, z -> 2250000}}}


তবে এটি একটি সম্পূর্ণ সমাধান গঠন করে না। কিছু নম্বর রয়েছে যা এর জন্য সমাধান করতে পারে না। উদাহরণ স্বরূপ,

AbsoluteTiming[f[30037]]
AbsoluteTiming[f[130037]]

{2.066699, ফাইন্ডআইনস্ট্যান্স [4/30037 == 1 / x + 1 / y + 1 / জেড && 0 <x <y <z, {x, y, z}, পূর্ণসংখ্যার]}
{1.981802, ফাইন্ড ইনস্ট্যান্স [4/130037 = = 1 / x + 1 / y + 1 / z && 0 <x <y <z, {x, y, z}, পূর্ণসংখ্যার]}


সঠিক কাজের জন্য সঠিক সরঞ্জাম। +1
উইলিয়াম বারবোসা

3
@ উইলিয়াম বারবোসা আমি যুক্তি দিয়েছিলাম যে FindInstanceএটি সঠিক সরঞ্জাম নয় কারণ এটি কোনও ফলাফলের গ্যারান্টি দিতে পারে না ...
হাওয়ার্ড

2
@ হওয়ার্ড আমি ম্যাথামেটিকার কথা বলছিলাম, আসলে
উইলিয়াম বারবোসা

Reduceজেদী মামলাগুলি সমাধান করার জন্য মনে হয়, যদিও এটি প্রায়শই সময় নেয়। উদাহরণস্বরূপ n = 10037 এর জন্য 82 সমাধানগুলি খুঁজতে 15 মিনিট।
ডেভিডসি

3

সি শার্প

দাবি অস্বীকারকারী: এটি কোনও গুরুতর উত্তর নয়

এটি কেবল 1 থেকে 1 << 30 এর মধ্যে সমস্ত সম্ভাবনাকে ভেঙে দেয়। এটি বিশাল, এটি ধীর গতির, আমি জানি না যে এটি সঠিকভাবে কাজ করে কিনা, তবে এটি স্পেসিফিকেশনগুলি বেশ আক্ষরিক অর্থে অনুসরণ করে, কারণ এটি প্রতি একক সময় শর্তটি পরীক্ষা করে, তাই এটি দুর্দান্ত। আমি এটি পরীক্ষা করিনি কারণ আইডোনটির প্রোগ্রামগুলির জন্য 5 দ্বিতীয় সময়সীমা থাকে এবং সুতরাং এটি কার্যকর করা শেষ করে না।

(যদি কেউ ভাবছেন: এটি পুরো 308 বাইট দীর্ঘ)

static double[]f(double n)
{
    for(double x=1;x<1<<30;x++)
    {
        for(double y=1;y<1<<30;y++)
        {
            for(double z=1;z<1<<30;z++)
            {
                if(4/n==1/x+1/y+1/z)
                    return new[]{x,y,z};
            }
        }
    }
    return null;
}

আপডেট: এটি স্থির করে তাই এটি কার্যকরভাবে কাজ করে


2
কাজ করে না (ইঙ্গিত: পূর্ণসংখ্যা বিভাগ)।
হাওয়ার্ড

রাউন্ড-অফ ত্রুটির কারণে সম্ভবত এটি কাজ করবে না।
সোমনিয়াম

@ ইউজার 2992539 এটি আমার পক্ষে কাজ করে, আমি এটি 5ইনপুট হিসাবে এটি পরীক্ষা করেছিলাম এবং এটি সঠিক ফলাফল দিয়েছে ( 2, 4, 20)
ক্রিস্টোফ বাহ্মওয়ালদার

@ হ্যাকারকো এটি বড় সংখ্যার জন্য কাজ না করে।
সোমনিয়াম

1
@ হ্যাকারকো আপনি অবশ্যই y = x + 1 এবং z = y + 1 দিয়ে সময় সাশ্রয় করতে পারবেন। সমপরিমাণ চেক 4xyz = n (xy + yz + xz) ব্যবহার করা সম্ভবত দ্রুততর হবে, যদিও আমি স্বীকার করি যে এটি দীর্ঘতর অভিব্যক্তি এবং এর চারপাশের সমস্যাও রয়েছে।
অ্যালকিমিস্ট

3

পাইথন 2 , 171 বাইট

from sympy import*
def f(n):
 for d in xrange(1,n*n):
  for p in divisors(4*d+n*n):
   q=(4*d+n*n)/p;x=(n+p)/4;y=(n+q)/4
   if (n+p)%4+(n+q)%4+n*x*y%d<1:return x,y,n*x*y/d

এটি অনলাইন চেষ্টা করুন!

প্রথম উত্তরটি সম্পূর্ণরূপে পরীক্ষার জন্য যথেষ্ট পর্যাপ্ত। এটি সমস্ত 3 solutions n এর জন্য সমাধানগুলি সন্ধান করতে সক্ষম মোট প্রায় 24 মিনিটের মধ্যে ≤ 1000000 এর মধ্যে প্রায় ১.৪ মিলি সেকেন্ডের ।

কিভাবে এটা কাজ করে

4 / n = 1 / x + 1 / y + 1 / z হিসাবে z = n · x · y / d হিসাবে আবার লিখুন , যেখানে d = 4 · x · y - n · x - n · y । তারপরে আমরা 4 · d + n 2 = (4 · x - n ) · (4 · y - n ) কে ফ্যাক্টর করতে পারি , যা আমাদের x এবং y এর দীর্ঘ হিসাবে হিসাবে সন্ধান করার আরও দ্রুততর উপায় দেয় । প্রদত্ত এক্স , আমরা অন্তত প্রমাণ করতে পারেন <3 · এন 2 /4 (অত: পর বাইরের লুপ উপর আবদ্ধ), যদিও বাস্তবে এটা অনেক ছোট-95 সময়% হতে থাকে, আমরা ব্যবহার করতে পারেন = 1, 2, বা 3. সবচেয়ে খারাপ ক্ষেত্রে n = 769129, যার জন্য সবচেয়ে ছোট ডি 1754 (এই ক্ষেত্রে প্রায় 1 সেকেন্ড সময় লাগে)। < y < z


1

গণিত, 99 বাইট

f[n_]:=(x=1;(w=While)[1>0,y=1;w[y<=x,z=1;w[z<=y,If[4/n==1/x+1/y+1/z,Return@{x,y,z}];++z];++y];++x])

এটি মোটামুটি নির্দোষ উদ্দীপনা, সুতরাং এটি সত্যিই ভাল স্কেল করে না। আমি অবশ্যই এক মিলিয়নে যাব (তাই আপাতত এটি অবৈধ বিবেচনা করুন) n = 100আধ n = 300সেকেন্ড সময় নেয় তবে ইতিমধ্যে 12 সেকেন্ড সময় নেয়।


1

Golflua 75

রাউন্ডআপ n(টার্মিনালে আবাহন পরে) প্রম্পট থেকে, কিন্তু মূলত হিসাবে iterates ক্যালভিন এর সখ সমাধান আছে:

n=I.r()z=1@1~@y=1,z-1~@x=1,y-1?4*x*y*z==n*(y*z+x*z+x*y)w(n,x,y,z)~$$$z=z+1$

উপরের একটি অব্যক্ত লুয়া সংস্করণটি

n=io.read()
z=1
while 1 do
   for y=1,z-1 do
      for x=1,y-1 do
         if 4*x*y*z==n*(y*z+x*z+x*y) then
            print(n,x,y,z)
            return
         end
      end
   end
   z=z+1
end

উদাহরণ:

n=6     -->     3      4     12
n=12    -->     6     10     15
n=100   -->    60     75    100
n=1600  -->  1176   1200   1225

1

পাইথন, 117

n=input();r=range;z=0
while 1:
 z+=1
 for y in r(z):
  for x in r(y):
    if 4*x*y*z==n*(y*z+x*z+x*y):print x,y,z;exit()

উদাহরণ:

16 --> 10 12 15

খুব বিশেষ কিছু না।


1
আপনি যদি কেবলমাত্র একবার এটি কল করতে চলেছেন তবে কেন আপনি কোনও ফাংশন সংজ্ঞায়িত করবেন?
isaacg

@ আইসএইচজি এটি কোনওভাবে বন্ধ হওয়া দরকার, তবে exit()পরিবর্তে ব্যবহার করা এটি হ্রাস করবে।
ক্যালভিনের শখ 12

0

সি # - 134

ঠিক আছে, আমি এখানে আগে একটি উত্তর পোস্ট করেছি, তবে এটি আসলে এতটা গুরুতর ছিল না। যেমনটি ঘটে, আমি প্রায়শই খুব বিরক্ত থাকি, তাই আমি এটি কিছুটা গল্ফ করেছিলাম।

এটি প্রযুক্তিগতভাবে সমস্ত উদাহরণ গণনা করে (আমি শেষ দুটি চেষ্টা করিনি কারণ, আবার, আদর্শ একটি 5 দ্বিতীয় সময় সীমাটি জোর করে বলে) তবে প্রথমগুলি সঠিক ফলাফল দেয় (অগত্যা যে ফলাফলটি আপনি গণনা করেছেন তা নয়, তবে একটি সঠিক)। এটা তোলে অদ্ভুত আদেশের বাইরে সংখ্যা আউটপুট (আমি কোন খেই কেন আছে) এবং এটি দেয় 10, 5, 2জন্য5 (যা উইকিপিডিয়ার অনুযায়ী একটি বৈধ উত্তর)।

আপাতত ১৩৪ বাইট, আমি সম্ভবত এটি আরও কিছুটা গল্ফ করতে পারি।

float[]f(float n){float x=1,y,z;for(;x<1<<30;x++)for(y=1;y<x;y++)for(z=1;z<y;z++)if(4/n==1/x+1/y+1/z)return new[]{x,y,z};return null;}

0

হাস্কেল - 150 টি অক্ষর

main = getLine >>= \n -> (return $ head $ [(x,y,z) | x <- [1..y], y <- [1..z], z <- [1..], (4/n') == (1/x) + (1/y) + (1/z)]) where n' = read n

এটি কাজ করা উচিত, তবে আমি এটি এখনও সংকলন করি নি। এটি অবশ্যই খুব খুব ধীর। এটি বৈধ পূর্ণসংখ্যার প্রতিটি ত্রিপলিটি পরীক্ষা করে এবং এটি যখন কাজ করে এমন কোনও সেট দেখায় তখন থামানো উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.