ব্যবহারিক সংখ্যা গণনা করুন


18

সংজ্ঞা

ধনাত্মক পূর্ণসংখ্যা nহল একটি ব্যবহারিক সংখ্যা (OEIS ক্রম A005153 ) যদি সমস্ত ছোট ধনাত্মক পূর্ণসংখ্যার পৃথক পৃথক বিভাজনের যোগফল হিসাবে প্রতিনিধিত্ব করা যায় n

উদাহরণস্বরূপ, 18একটি ব্যবহারিক সংখ্যা: এর বিভাজকগুলি 1, 2, 3, 6, 9, এবং 18 এবং 18 এর চেয়ে কম অন্যান্য ধনাত্মক পূর্ণসংখ্যাগুলি নিম্নলিখিত হিসাবে গঠিত হতে পারে:

 4 = 1 + 3          5 = 2 + 3           7 = 1 + 6
 8 = 2 + 6          10 = 1 + 9         11 = 2 + 9
12 = 3 + 9 = 1 + 2 + 9 = 1 + 2 + 3 + 6
13 = 1 + 3 + 9      14 = 2 + 3 + 9      15 = 6 + 9
16 = 1 + 6 + 9      17 = 2 + 6 + 9

তবে 14এটি একটি ব্যবহারিক সংখ্যা নয়: এর বিভাজকগুলির সংখ্যা 1, 2, 7 এবং 14 এবং এগুলির কোনও উপসেট নেই যা 4, 5, 6, 11, 12 বা 13 যোগ করে।

চ্যালেঞ্জ

একটি প্রোগ্রাম, ফাংশন, বা ক্রিয়া লিখুন যা ইনপুটটিকে ধনাত্মক পূর্ণসংখ্যার হিসাবে গ্রহণ করে xএবং হয় ওইআইএসের সাথে সামঞ্জস্যের জন্য 1 থেকে সূচিযুক্ত x তম ব্যবহারিক সংখ্যাটি প্রেরণ বা মুদ্রণ করে । আপনার কোডটি অবশ্যই পর্যাপ্ত দক্ষ হতে হবে যে এটি একটি যুক্তিসঙ্গত ডেস্কটপ কম্পিউটারে দুই মিনিটেরও কম 250000 পর্যন্ত ইনপুট পরিচালনা করতে পারে। (জাভাতে আমার রেফারেন্স প্রয়োগকরণ 0.5 সেকেন্ডেরও কম সময়ে 250000 পরিচালনা করে এবং পাইথনে আমার রেফারেন্স প্রয়োগকরণ এটি 12 সেকেন্ডের মধ্যে পরিচালনা করে)।

পরীক্ষার মামলা

Input        Expected output
1            1
8            18
1000         6500
250000       2764000
1000000      12214770
3000000      39258256

(আইএমএইচও) যদি দ্রুততম কোড (প্রতি ভাষা?) জিততে পারে তবে তা আকর্ষণীয়ও হতে পারে
নাম প্রকাশ করুন

4
@ সার্জবর্শ তাই আপনি উত্তরগুলিতে 250K এন্ট্রিগুলির সারণী দেখতে পাবেন
ডঃ বেলিসারিয়াস

@ বিলেসারিয়াস ভাল পয়েন্ট। তবে আমি মনে করি যে এই জাতীয় প্রতারণা সহজেই নিষিদ্ধ করা যেতে পারে। বা সমস্যাটির যে কোনও সংখ্যার জন্য সঠিক উত্তর প্রয়োজন হতে পারে , তবে স্ট্যান্ডার্ড লাইব্রেরিতে বড় ইন্টিজার না থাকলে কোনও ভাষায় এটি করার সময় অসুবিধা হতে পারে ...: /
নাম

আমার মনে একটি অ্যালগরিদমিক অপ্টিমাইজেশন রয়েছে তবে বর্তমান বিধিগুলির সাথে আমি এটি বাস্তবায়নে খুব অলস করছি: পি
ডিসপ্লে নাম

4
@ সার্জবর্শ, আপনি যদি নিজের কোডটি গল্ফ করতে না চান তবে এটিকে gist.github.com এর মতো কিছুতে আপলোড করতে এবং এখানে একটি মন্তব্যে বা আড্ডায় একটি লিঙ্ক ফেলে দিতে পারেন। FWIW আমি দুটি কারণে দ্রুততম কোডে উদার পারফরম্যান্সের সীমাবদ্ধতা সহ কোড গল্ফকে পছন্দ করি: প্রথমত, কোডটির দৈর্ঘ্য আরও সুস্পষ্টভাবে পরিমাপযোগ্য; দ্বিতীয়ত, এটি ট্রেড অফের একটি উপাদান উপস্থাপন করে: কোন গতি অপ্টিমাইজেশানটি কর্মক্ষমতা নষ্ট না করে কোডটি ছোট করার জন্য ছেড়ে যেতে পারে?
পিটার টেলর

উত্তর:


5

জে (99 টি চর)

f=:3 :0
'n c'=.0 1
while.c<y do.
'p e'=.__ q:n=.n+2
c=.c+*/(}.p)<:}:1+*/\(<:p^e+1)%<:p
end.
n+n=0
)

যেহেতু সমস্যা বিবৃতিটি "প্রোগ্রাম, ফাংশন" চেয়েছে বা ক্রিয়া " , তাই কাউকে জে সাবমিশন করতে হয়েছিল। জে লোকেরা লক্ষ্য করবে যে আমি সত্যিই গল্ফ (!) বা এটিকে অনুকূলিত করি নি। অন্যান্য এন্ট্রিগুলির মতো, আমি স্টিয়ার্টের উপপাদ্যটি ওআইআইএস লিঙ্কে উল্লিখিত ব্যবহার করেছিলাম, প্রতিটি সংখ্যার ব্যবহারিক কিনা তা পরীক্ষা করার জন্য।

আমার কাছে জে ইনস্টল থাকা "যুক্তিসঙ্গত ডেস্কটপ কম্পিউটার" এ প্রস্তুত প্রবেশাধিকার নেই। আমার ছয় বছরের পুরাতন f 250000নেটবুকটি ১২০..6 সেকেন্ডের মধ্যে গণনা করে, যা দুই মিনিটের বেশি নয়, তবে সম্ভবত কিছুটা যুক্তিসঙ্গত কম্পিউটারে এটি সময়মতো শেষ হয়।


6

গণিত, 126 টি চার্স

বেলিসারিয়াসকে ধন্যবাদ

উইকিপিডিয়ায় সূত্র ব্যবহার করা।

f=(i=j=1;While[j<#,If[And@@Thread[#[[;;,1]]<2+Most@DivisorSum[FoldList[#Power@@#2&,1,#],#&]&@FactorInteger@++i],j++]];i)&

উদাহরণ:

f[1]

1

f[8]

18

f[250000]

2764000

এটি f[250000]আমার কম্পিউটারে গণনা করতে 70s লেগেছে ।


3
আমি মনে করি আপনি বিজোড় পূর্ণসংখ্যা বাইপাস করে একটি চর ব্যয় করে আরও ভাল পারফরম্যান্স পেতে পারেন
ডঃ বেলিসারিয়াস

1
ওইআইএস সাবমিশন থেকে কোড হ্রাস করার ক্ষেত্রে, আপনি কার্য সম্পাদনকে 10-গুণ কমিয়ে দিয়েছেন। শুধু ভাবছি, "আপনি কী ভাবেন যে আপনার কোড OEIS উদাহরণের চেয়ে এত ধীর গতিতে চলে?"
ডেভিডসি

@ বিলেসারিয়াস আপনার পরামর্শটি প্রত্যাশার মতো সময়টিকে অর্ধেকে কেটে দেয়।
ডেভিডসি

2
119 টি (i=j=1;While[j<#,If[And@@Thread[#[[;;,1]]<2+Most@DivisorSum[FoldList[#Power@@#2&,1,#],#&]&@FactorInteger@++i],j++]];i)&
অক্ষরে

3

হাস্কেল - 329

s 1=[]
s n=p:(s$div n p)where d=dropWhile((/=0).mod n)[2..ceiling$sqrt$fromIntegral n];p=if null d then n else head d
u=foldr(\v l@((n,c):q)->if v==n then(n,c+1):q else(v,1):l)[(0,1)]
i z=(z<2)||(head w==2)&&(and$zipWith(\(n,_)p->n-1<=p)(tail n)$scanl1(*)$map(\(n,c)->(n*n^c-1)`div`(n-1))n)where w=s z;n=u w
f=((filter i[0..])!!)

উদাহরণ:

> f 1
1
> f 13
32
> f 1000
6500

এখানে একটি ছোট পরীক্ষার স্যুট (উপরের দিকে সংশোধন):

import Data.Time.Clock
import System.IO

test x = do
    start <- getCurrentTime
    putStr $ (show x) ++ " -> " ++ (show $ f x)
    finish <- getCurrentTime
    putStrLn $ " [" ++ (show $ diffUTCTime finish start) ++ "]"

main = do
    hSetBuffering stdout NoBuffering
    mapM_ test [1, 8, 1000, 250000, 1000000, 3000000]

সংকলিত হওয়ার পরে পরীক্ষার ফলাফল ghc -O3:

1 -> 1 [0.000071s]
8 -> 18 [0.000047s]
1000 -> 6500 [0.010045s]
250000 -> 2764000 [29.084049s]
1000000 -> 12214770 [201.374324s]
3000000 -> 39258256 [986.885397s]

আমি যখন এটিকে চেষ্টা করি তখন এটি অভিযোগ করে parse error on input `='। আমার কি কিছু পতাকা বা অন্য ব্যবহার করা দরকার?
পিটার টেলর

1
@ পিটারটেলর আপনি ফাংশন সংজ্ঞাগুলি এর মতো ঘেসি তে পেস্ট করতে পারবেন না। সবচেয়ে সহজ আপনি যা করতে পারেন তা এটিতে সংরক্ষণ করুন asdf.hsএবং চালান ghci asdf.hs, তারপরে সেখান থেকে আপনি অ্যাক্সেস করতে সক্ষম হবেনf
mniip

@PeterTaylor ghc --make -O3 [filename]। আপনি এটিকে সাথে গিগিতেও লোড করতে পারেন :l [filename]তবে সংকলিত সময়ের সীমাবদ্ধতা দেওয়া সম্ভবত সেরা। :)
জোনাথন ভান মাত্রে

উপরের মন্তব্যে যেমন ghci
জোনাথনভানম্যাট্রে

আহ, ঠিক আছে. ইতিমধ্যে আমি এটি আপনার পরীক্ষার কাঠামোর সাথে চালিয়ে পেয়েছি এবং ghc। আপনার কম্পিউটারটি আমার চেয়ে দ্রুত, তবে এটি এখনও 98 সেকেন্ডে আমার কম্পিউটারে পারফরম্যান্সের মাপদণ্ডের মধ্যে রয়েছে।
পিটার টেলর

2

জাভাস্ক্রিপ্ট, 306 307 282 বি

function y(r){for(n=r-1,k=1;n;k++)if(p=[],e=[],c=0,P=s=1,!((x=k)%2|1==x)){while(x>1){for(f=x,j=2;j<=Math.sqrt(f);j++)if(f%j==0){f=j;break}f!=p[c-1]?(p.push(f),e.push(2),c++):e[c-1]++,x/=f}for(i=0;c>i;i++){if(p[i]>P+1){s=0;break}P*=(Math.pow(p[i],e[i])-1)/(p[i]-1)}s&&n--}return k-1}

প্রায় 250 কে। আমার ল্যাপটপে 6 এস।

অ-গল্ফড কোড মন্তব্য করেছে: http://jsfiddle.net/82xb9/3/ এখন আরও ভাল সিগমা-পরীক্ষার সাথে ভাল শর্ত থাকলে (ধন্যবাদ আপনাকে মন্তব্যগুলি)

প্রাক-সম্পাদনা সংস্করণ: http://jsfiddle.net/82xb9/ http://jsfiddle.net/82xb9/1/


প্রশ্নটি কোনও ফাংশন বা প্রোগ্রামের জন্য জিজ্ঞাসা করে (জেএসের ক্রিয়াগুলি নেই), সুতরাং প্রথম লাইনটি গণনা না করে আপনাকে কোনও ফাংশন ঘোষণায় দ্বিতীয় লাইনটি মোড়ানো উচিত এবং ফাইনালের k--;সাথে প্রতিস্থাপন করা উচিত return k-1। যদিও আপনার বাইট গণনা সামান্য বৃদ্ধি পায়, আপনি প্রতিস্থাপন মত বিষয়গুলিতে কয়েক সঞ্চয় করতে পারেন p[i]>=P+2সঙ্গে p[i]>P+1(এবং সম্ভবত অভ্যন্তরীণ ফাংশন কল সরানোর এবং একটি ব্যবহার করে breakপরিবর্তে)।
পিটার টেলর

আমি মনে করি "টেস্টিং সিগমা" অংশটি আকার এবং গতি উভয়ের জন্যই আবার লেখা যেতে পারে: jsfiddle.net/3DTSa । যদিও এই জেএস সমাধানটি তত দ্রুত।
ব্যবহারকারী 2846289
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.