একটি প্রাকৃতিকভাবে ঘটে যাওয়া প্রধান জেনারেটর


42

বেশিরভাগ সংখ্যক প্রাইম উত্পাদনকারী ফাংশন রয়েছে। খুব সুন্দর এগুলি সমস্তই নির্মিত এবং এটি ইরোটোস্টিনিস, মাইবিয়াস ফাংশন বা উইলসনের উপপাদ্যকে চালিত করে এবং সাধারণত অনুশীলন হিসাবে গণনা করা যায় না। তবে জেনারেটরগুলিও রয়েছে, এটির খুব সহজ কাঠামো রয়েছে এবং এটি দুর্ঘটনাক্রমে পাওয়া গেছে।

2003 সালে স্টিফেন ওল্ফ্রাম এনকেএস গ্রীষ্মকালীন বিদ্যালয়ে একটি লাইভ কম্পিউটার পরীক্ষায় নেস্টেড পুনরাবৃত্তি সমীকরণগুলির একটি শ্রেণীর সন্ধান করেছিলেন। ম্যাথু ফ্র্যাঙ্কের আশেপাশের একদল লোক অতিরিক্ত পরীক্ষাগুলি অনুসরণ করেছিল এবং কেবল পুনরাবৃত্তির একটি আকর্ষণীয় সম্পত্তি আবিষ্কার করেছিল

a(n) = a(n-1) + gcd(n,a(n-1))

শুরু মান সহ a(1) = 7। পার্থক্যটি a(n) - a(n-1) = gcd(n,a(n-1))সর্বদা 1 বা প্রধান হিসাবে মনে হয়েছিল। প্রথম কয়েকটি পার্থক্য হ'ল ( OEIS A132199 ):

1, 1, 1, 5, 3, 1, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 3, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 3, 1, 5, 3, ...

আমরা যদি কেবল 1 টি বাদ দিই তবে আমরা নিম্নলিখিত ক্রমটি পাই ( OEIS A137613 ):

5, 3, 11, 3, 23, 3, 47, 3, 5, 3, 101, 3, 7, 11, 3, 13, 233, 3, 467, 3, 5, 3, 
941, 3, 7, 1889, 3, 3779, 3, 7559, 3, 13, 15131, 3, 53, 3, 7, 30323, 3, ...

এরিক এস রোল্যান্ড কয়েক বছর পরে এই তালিকার প্রতিটি উপাদানটির আধিপত্য প্রমাণ করেছিলেন। আপনি দেখতে পাচ্ছেন, প্রাইমগুলি মিশ্রিত হয় এবং এর মধ্যে কয়েকটি একাধিকবার প্রদর্শিত হয়। এটিও প্রমাণিত হয়েছে যে ক্রমটি অসীম অনেকগুলি স্বতন্ত্র প্রাইমকে অন্তর্ভুক্ত করে। তদতিরিক্ত এটি অনুমান করা হয়, যে সমস্ত বিজোড় প্রাইম প্রদর্শিত হবে।

যেহেতু এই প্রাইম জেনারেটরটি নির্মাণ করা হয়নি তবে কেবল দুর্ঘটনাক্রমে পাওয়া গেছে, প্রাথমিক জেনারেটরটিকে "প্রাকৃতিকভাবে ঘটমান" বলা হয়। তবে লক্ষ্য করুন যে অনুশীলনে এই জেনারেটরটি গণনা করাও বেশ অপ্রয়োজনীয়। এটি দেখা যাচ্ছে যে, একটি প্রাইম পি কেবল (p–3)/2পরপর 1 সের পরে উপস্থিত হয় । তবুও এই প্রধান জেনারেটরটি কার্যকর করা আপনার কাজ হবে।

চ্যালেঞ্জ:

একটি ক্রিয়াকলাপ বা একটি প্রোগ্রাম লিখুন nযা সিকোয়েন্সের প্রথম উপাদানগুলি মুদ্রণ করে A137613(1s ছাড়াই অনুক্রম)। আপনি n >= 0এসটিডিআইএন, কমান্ড-লাইন আর্গুমেন্ট, প্রম্পট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নম্বরটি পড়তে পারেন । nযেকোন পাঠযোগ্য বিন্যাসে প্রথম উপাদানগুলি STDOUT এ আউটপুট করুন বা এই মানগুলির সাথে একটি অ্যারে বা একটি তালিকা ফেরত দিন।

এটি কোড-গল্ফ। অতএব সংক্ষিপ্ততম কোড জিতেছে।

লিডারবোর্ড:

নিয়মিত লিডারবোর্ড এবং ভাষার দ্বারা বিজয়ীদের একটি সংক্ষিপ্ত বিবরণ উভয়ই তৈরি করতে এখানে একটি স্ট্যাক স্নিপেট। আপনার উত্তরটি প্রদর্শিত হয়েছে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেমপ্লেটটি ব্যবহার করে আপনার উত্তরটি শিরোনাম দিয়ে শুরু করুন:

# Language Name, N bytes

যেখানে এন আপনার জমা দেওয়ার আকার। আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন। এই ক্ষেত্রে:

# Ruby, <s>104</s> <s>101</s> 96 bytes


1
প্রাইম জেনারেটরটি নির্মিত না হলেও আপনি পুনরাবৃত্তিটি ব্যবহার করে কার্যকরভাবে একটি পরীক্ষা বিভাগ প্রয়োগ করছেন।
orlp

যদি একটি (1) = 7 হয় তবে ক্রমটি 7 দিয়ে শুরু হয় না কেন?
শুক্রবার

3
@feersum কারণ ক্রম আমরা সঙ্গে সংশ্লিষ্ট হয়a(n)-a(n-1)
Maltysen

nশূন্য হতে পারে?
Sp3000

1
@ Jrenk নিশ্চিত নয় হতে পারে এটি 2 বাইট হিসাবে গণনা করুন (যেহেতু আপনি 2 টি অক্ষর অপসারণ করছেন //) এবং এটি আপনার জমা দেওয়ার ক্ষেত্রে ব্যাখ্যা করুন। যদি কেউ আপনার সাথে একমত না হন তবে আপনি সর্বদা আপনার পোস্ট সম্পাদনা করতে পারেন।
জাকুবে

উত্তর:



7

পাইথন 3.5.0b1 +, 95 93 বাইট

পাইথন 3.5.0b1 + রিলিজের লিঙ্ক

import math
def f(k,n=2,a=7,L=[]):x=math.gcd(n,a);return k and f(k-1%x,n+1,a+x,L+1%x*[x])or L

পুনরাবৃত্তির প্রত্যক্ষ বাস্তবায়ন, বৈশিষ্ট্যযুক্ত:

  • আমাদের ভাল বন্ধু 1%x, এবং
  • math.gcdবিরোধী হিসাবে fractions.gcd

কি করে 1%x? পার্শ্ব প্রশ্ন: পাইথনের সংশোধন ইতিহাসের দলিলগুলি যেখানে আমি বেতাস অন্তর্ভুক্ত করব? সম্পাদনা: কিছুই নয়, এটি পুনর্বিবেচনার ইতিহাসের নীচে খুঁজে পেয়েছে ।
mbomb007

@ mbomb007 যেহেতু x >= 1, 1%x0 যদি x == 1, অন্যথায় 1 প্রদান করে ( xতালিকায় যুক্ত করা হবে কিনা তা সিদ্ধান্ত নিতে ব্যবহৃত হয়েছিল )
Sp3000

5

জুলিয়া, 110 বাইট

n->(a(n)=(n1&&(n==1?7:a(n-1)+gcd(n,a(n-1))));i=2;j=0;while j<n x=a(i)-a(i-1);x>1&&(j+=1;println(x));i+=1end)

Ungolfed:

function a(n::Int)
    n  1 && (n == 1 ? 7 : a(n-1) + gcd(n, a(n-1)))
end

function f(n::Int)
    i = 2;
    j = 0;
    while j < n
        x = a(i) - a(i-1)
        if x > 1
            j += 1
            println(x)
        end
        i += 1
    end
end

বাহ, একটি নিখুঁত 8 কে, দুর্দান্ত: ডি
বিটা ডেকে

1
n<2পরিবর্তে ব্যবহার করুন n==1। এছাড়াও, যদি আপনি সামনে পিছন পরিবর্তে তাকান, আপনি ব্যবহার করতে পারেন i=1এবং x=a(i)-a(i+=1), এবং তারপর println(-x)এবং -x>1সঠিক নঞর্থকতা জন্য, যার ফলে একটি পৃথক বৃদ্ধি প্রয়োজনীয়তার এড়ানো i। এবং তিনটি বাইট, যখন >=দুটি হয় ... তবে তারপরে, আপনি এটির n<1||()পরিবর্তে ব্যবহার করতে পারেন n>=1&&()... এবং তবুও, এটি প্রথম স্থানেও প্রয়োজনীয় নয় (শর্তসাপেক্ষে ফেলে দিন, এন কখনই 1 এর চেয়ে কম হবে না)। একটি (এন) সংজ্ঞায়িত করার সময় আপনার বাহ্যিকতম বন্ধনীগুলিরও প্রয়োজন হবে না। এই পরিবর্তনগুলির সাথে আপনার কমপক্ষে 97 বাইটে নামা উচিত।
গ্লেন ও

5

পিএইচপি, 101 96 99 98 77 72 বাইট

<?for(;2>$t=gmp_strval(gmp_gcd(~++$i,7+$e+=$t))or$argv[1]-=print"$t ";);


ব্যবহার:
স্ক্রিপ্টটিকে একটি আর্গুমেন্টের সাথে কল করুন: php -d error_reporting=0 script.php 30
আপনি যদি এটি পরীক্ষা করতে চান তবে ;extension=php_gmp.dllআপনার php.ini এ আপনার কোনও অসুবিধা করা দরকার
-> extension=php_gmp.dll
আমার বাইট গণনায় আমার কি এক্সটেনশন যুক্ত করা উচিত? কোন চিন্তা?


লগ:
ইসমাইল মিগুয়েলকে 3 বাইট সংরক্ষিত
প্রিমোর জন্য 26 বাইট সংরক্ষণ করা হয়েছে।


1
আপনি নিজের খোলার ট্যাগটি সংক্ষিপ্ত <?করে সংজ্ঞাটি মুছে ফেলতে পারেন $j
ইসমাইল মিগুয়েল

1
হ্যাঁ, এটি গণনা করা হয়েছে। তবে আপনি এই নতুনলাইনটি সরাতে পারেন। আপনি আপনার কোডের আকারটি কীভাবে গণনা করেছেন তার উপর নির্ভর করে যা 1-2 বাইট সংরক্ষণ করবে।
ইসমাইল মিগুয়েল

1
ক্ষুদ্র উন্নতি: ব্যবহার করুন <মধ্যে $j<=$argv[1](কপি করে প্রিন্ট এক অনেকগুলি) (-1)। $eঅবিচ্ছিন্ন ছেড়ে দিন , $e+7পরিবর্তে ব্যবহার করুন (-3)। for(;;)পরিবর্তে ব্যবহার করুন while(), প্রাক- এবং পোস্ট-এক্সপ্রেশন (-2) ব্যবহার করে। প্রতিস্থাপন echo$t.' ';$j++সঙ্গে $j+=print"$t ", বন্ধনী ড্রপ (-3)। (-2) if($t>1)দিয়ে প্রতিস্থাপন করুন 2>$t||। এ অ্যাসাইনমেন্ট একত্রিত $tশর্তাধীন, সুইচ সঙ্গে ||জন্য or, বন্ধনী ড্রপ (-5)। সরান $argv[1]করতে $j, বৃদ্ধি সমগ্র অভিব্যক্তি সরাতে forশর্তসাপেক্ষ (-2)। পরিবর্তন >=$j+=printকরার জন্য -=print(-3)। ধাপে ধাপে: codepad.org/s6LNSPSM
প্রিমো

1
@ প্রিয়মো সুন্দর ব্যাখ্যার জন্য ধন্যবাদ! জানতাম না যে আমি এই সব করতে পারি।
জেরেঙ্ক

1
আরও কয়েকটি: (-2) এর $e+7সাথে একত্রিত করুন $e+=$t$iঅবিচ্ছিন্ন ছেড়ে দিন , ~++$iপরিবর্তে ব্যবহার করুন (-3)। codepad.org/fDIImajp
প্রিমো

4

হাস্কেল, 51 বাইট

d=zipWith gcd[2..]$scanl(+)7d
f=($filter(>1)d).take

দ্রষ্টব্য এটি fএমন একটি ফাংশন যা প্রথম এন উপাদানগুলিকে ফিরিয়ে দেবে ।

a(n)পার্থক্যগুলি গণনা করা এবং তারপরে পার্থক্যগুলি সমাধান করার পরিবর্তে আমরা পার্থক্যগুলি গণনা করি d(n)এবং তাদের একত্রে পেতে সমষ্টি করি a(n)। (হাস্কেলের সাথে যারা অপরিচিত তারা প্রতিবাদ করতে পারে যে আমাদের a(n)পেতে প্রথমে আমাদের প্রয়োজন d(n), তবে অবশ্যই অলস মূল্যায়ন আমাদের এই সমস্যার আশেপাশে পেয়ে যায়!)

Ungolfed:

a = scanl (+) 7 d        -- yielding a(n) = 7 + d(1) + d(2) + ... + d(n-1)
d = zipWith gcd [2..] a  -- yielding d(n) = gcd(n+1, a(n))

f n = take n $ filter (> 1) d -- get rid of 1s and take the first n

4

পাইথ, 30 বাইট

খুব খারাপভাবে গল্ফ করা হয়েছে, যথেষ্ট পরিমাণে হ্রাস করা যায়। সামনে পুনরাবৃত্ত ফাংশন সংজ্ঞায়িত করে, .first-n ফিল্টার করে এবং তারপরে পার্থক্যটি মানচিত্র করে।

L?tb+KytbibK7m-yhdyd.ft-yhZyZQ

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


এটি এর জন্য ভুল আউটপুট দেয়n = 0
Sp3000

2
@ Sp3000 এটি পাইথের বাগ। আমি একটি টান অনুরোধ করব।
মালটিসেন

বাগ পাওয়া গেছে এবং স্থির হয়েছে - গিথুব ডিডোএসডি করা বন্ধ হয়ে গেলে প্যাচটি কার্যকর করা হবে।
ইসাকাক

1
এটি এখানে: মেটা কোডেগল্ফ.স্ট্যাকেক্সেক্সঞ্জ / প্রশ্নগুলি / ৫৩১৮/২ । ব্যক্তিগতভাবে আমি একটি উত্তর হিসাবে প্রোগ্রামিং ভাষাগুলির বাগ সংশোধন বিবেচনা করব
টমাস ওয়েলারের

2
@ থমাস ওয়ালার এটি পুরো ভাষা অর্জন করেছিল ...
২a

4

জুলিয়া, 69 67 বাইট

n->(i=1;a=7;while n>0 x=gcd(i+=1,a);a+=x;x>1&&(n-=1;println(x))end)

এটি সমস্যার একটি সহজ পুনরাবৃত্তি সমাধান। xপার্থক্য (যা হয় gcd), এবং তারপর আমি আপডেট aযোগ করে x


আমি মনে করি এটি এ 231900 মুদ্রণ করে
আলেফাল্ফা

@ এলফাল্ফ - আমার মনে হয় আমি ত্রুটিটি দেখছি। সহজেই স্থির। এমনকি প্রক্রিয়াতে দুটি বাইট শেভ করা।
গ্লেন ও

3

জাভাস্ক্রিপ্ট (ES6), 91

পুনরাবৃত্ত গিসিডি, পুনরাবৃত্তি মূল ফাংশন। এত দ্রুত নয়।

সাধারণ নোট: যে কোনও ইকামাস্ক্রিপ্ট comp অনুবর্তী ব্রাউজারে স্নিপেট চলমান পরীক্ষা করুন (উল্লেখযোগ্যভাবে ক্রোম এমএসআইই নয়, আমি ফায়ারফক্সে পরীক্ষা করেছি, সাফারি 9 যেতে পারে)

F=m=>{
  for(G=(a,b)=>b?G(b,a%b):a,o=[],p=7,n=1;m;d>1&&(o.push(d),--m))
    p+=d=G(++n,p);
  return o
}

O.innerHTML=F(+I.value)
<input id=I value=10><button onclick='O.innerHTML=F(+I.value)'>-></button>
<pre id=O></pre>


3

হাস্কেল, 74 71 66 বাইট

f=($filter(>1)$tail>>=zipWith(-)$scanl(\x->(x+).gcd x)7[2..]).take

কৌশলটি এখানে ব্যবহার করেছেন: https://codegolf.stackexchange.com/a/39730/43318 , এবং বিন্দু মুক্ত করেছেন।

(পূর্ববর্তী: by১ বাইট)

a=scanl(\x->(x+).gcd x)7[2..]
f m=take m$filter(>1)$zipWith(-)(tail a)a

প্রথমে একটি এর ক্রম তৈরি করুন এবং তারপরে পার্থক্যগুলি গ্রহণ করুন।

(পূর্ববর্তী: by৪ বাইট)

f m=take m$filter(>1)$map snd$scanl(\(x,d)->(\y->(x+y,y)).gcd x)(7,1)[2..]

স্ট্যান্ডার্ড তালিকা ফাংশন, লম্বা ফাংশনের চতুর ব্যবহার। নোট করুন এটি আরও স্পষ্টর চেয়ে 1 বাইট কম sh

g m=take m$filter(>1)$map snd$scanl(\(x,d)n->(x+gcd x n,gcd x n))(7,1)[2..]

আমরা যদি আমদানি গণনা না করি তবে আমি এটিকে 66 এ নামিয়ে আনতে পারি।

import Data.List
h m=take m$filter(>1)$snd$mapAccumL(\x->(\y->(x+y,y)).gcd x)7[2..]

3

পারি / জিপি, 60 বাইট

a(n)=a=7;i=1;while(n,if(1<d=gcd(i+=1,a),n-=1;print(d));a+=d)

A (n) - a (n-1) = gcd (n, a (n-1)) এর সংজ্ঞা থেকে কম-বেশি সরাসরি নেওয়া হয়েছে

এর জন্য আউটপুট a(20):

5
3
11
3
23
3
47
3
5
3
101
3
7
11
3
13
233
3
467
3

2

সি ++, 193 182 180 172 বাইট

ধন্যবাদ @ জাকুব - আউটপুটটিতে 8 বাইট সংরক্ষণ করা

int g(int a,int b){return a==b?a:a>b?g(b,a-b):g(a,b-a);}void f(int *r,int n){int m=1,i=0,a=7,b;while(i<n){b=g(a,++m);if(b>1){r[i]=b;++i;}a+=b;}}int main(){int r[6];f(r,6);}

আপনি সম্ভবত কোনও ফাংশন সংজ্ঞায়িত করে কিছু বাইট সংরক্ষণ করতে পারেন fযা ফলাফলের সাথে অ্যারে দেয়। এইভাবে আপনি অন্তর্ভুক্ত, স্ক্যানফ এবং মুদ্রণটি সরাতে পারেন।
জাকুব

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