सुंदरम की चलनी (अभाज्य संख्या खोजने के लिए)


13

चुनौती

नीचे दिए गए प्राइम नंबर खोजने के लिए सुंदरम छलनी को लागू करें n। एक इनपुट पूर्णांक लें n, और नीचे की प्रमुख संख्याओं को आउटपुट करें n। आप मान सकते हैं कि nहमेशा एक मिलियन से कम या बराबर होगा।


चलनी

  1. से पूर्णांकों की एक सूची के साथ शुरू 1करने के लिए n

  2. उन सभी नंबरों को निकालें जो फॉर्म i + j + 2ijमें हैं:

    • iऔर jसे कम हैं njहमेशा से बड़ा या बराबर होता है i, जो इससे अधिक या उसके बराबर होता है 1

    • i + j + 2ij से कम या बराबर है n

  3. शेष संख्याओं को गुणा करें 2, और जोड़ें 1

यह सभी अभाज्य संख्याओं को छोड़ देगा (सिवाय 2, जो आपके आउटपुट में शामिल किया जाना चाहिए) से कम 2n + 2


यहाँ छलनी का एक एनीमेशन है जिसका उपयोग नीचे दिए गए प्राइम खोजने के लिए किया जा रहा है 202


उत्पादन

आपका उत्पादन हर मुख्य पूर्णांक ≤ n(आरोही क्रम में) के बाद होना चाहिए :

2
3
5

कहाँ nहै 5


उदाहरण

> 10
2
3
5
7

> 30
2
3
5
7
11
13
17
19
23
29

इनपुट्स द्वारा निरूपित किए जाते हैं >


आपका उदाहरण n=30आउटपुट में 29 गायब है।
इसहाक

5
एक विशिष्ट विधि का उपयोग करने के लिए कहने वाली चुनौतियों के साथ एक परेशानी यह है कि यह स्पष्ट नहीं है कि कोई संशोधन क्या कर सकता है। उदाहरण के लिए, केवल अपने विवरण की जाँच करता (i,j)साथ i<=jहै, लेकिन परिणाम अगर हम इस आवश्यकता को नजरअंदाज नहीं बदलता है। क्या हम बाइट्स बचाने के लिए ऐसा कर सकते हैं?
xnor

मैंने कभी नहीं कहा कि आपको जाँच करनी है i <= j। यह सिर्फ यह है कि छलनी कैसे काम करता है। तो हाँ, आप i <= jअपने कोड में छोड़ सकते हैं । @ एक्सनोर
ज़ैच गेट्स

2
हमारे यहां कितना लेवे हैं? छलनी सभी विषम संख्याओं का चयन करने के बराबर है (क्योंकि परिणाम फॉर्म के हैं 2n+1) जो कि फॉर्म के नहीं हैं 2(i + j + 2ij)+1- क्या हम इस संपत्ति को सीधे संभावित अपराधों पर परीक्षण कर सकते हैं या क्या हमारे कोड को किसी बिंदु पर 2 प्लस 1 करना होगा? ?
मार्टिन एंडर

1
मैं nइस बात से थोड़ा भ्रमित हूं कि पूरी बात क्या है। विधि विवरण में, यह कहता है कि यह सभी प्राइम तक उत्पन्न करेगा 2 * n + 2। लेकिन इनपुट / आउटपुट विवरण में, यह कहता है कि इनपुट है n, और आउटपुट सभी तक पहुंच जाता है n। तो क्या हम सभी primes को उत्पन्न करने के लिए विधि को लागू करने वाले हैं 2 * n + 2, और फिर nआउटपुट से बड़े लोगों को छोड़ देते हैं ? या हमें nइनपुट से विधि विवरण में गणना करनी चाहिए n?
रेटो कोराडी

जवाबों:


7

पायथ, 23 बाइट्स

2j@JSQmhyd-Jm+sdy*Fd^J2

प्रदर्शन

वास्तव में सिर्फ दिए गए एल्गोरिथ्म को लागू करता है।


3

हास्केल, 93 90 बाइट्स

import Data.List
g n=unlines[show$2*x+1|r<-[[1..n]],x<-2:(r\\[i+j+2*i*j|j<-r,i<-r]),2*x<n]

यह कैसे काम करता है: [i+j+2*i*j|j<-r,i<-r]सभी i+j+2ijको हटा दिया जाता है ( \\) से [1..n]। स्केल 2x+1और उन्हें एक स्ट्रिंग ( show) में बदल दें । एनएल ( unlines) के साथ जुड़ें ।


1

स्काला, 115 124 122 115 114 बाइट्स

n=>{println(2);for{m<-1 to n;if !(for{j<-1 to n;i<-1 to j}yield i+j+2*i*j).contains(m);o=2*m+1;if o<=n}println(o)}

एक अनाम फ़ंक्शन; एक तर्क के रूप में n लेता है और परिणाम को प्रिंट करता है।


1

जावास्क्रिप्ट (ईएस 7), 107 105 बाइट्स

ऐरे कॉम्प्रिहेंशन कमाल के हैं! लेकिन मुझे आश्चर्य है कि जेएस की कोई सीमा सिंटैक्स (जैसे [1..n]) क्यों नहीं है ...

n=>{for(a=[i=1];i<n;a[i++]=i);for(i=0;i++<n;)for(j=0;j<n;a[i+j+++2*i*j]=0);return[for(i of a)if(i)i*2+1]}

यह फ़ायरफ़ॉक्स 40 में सफलतापूर्वक परीक्षण किया गया था। ब्रेकडाउन:

n=>{
  for(a=[i=1];i<n;a[i++]=i); // fill a list with 1..n
  for(i=0;i++<n;)            // for each integer i in 0..n
    for(j=0;j<n;)            //   for each integer j in 0..n
      a[i+j+++2*i*j-1]=0;    //     set the corresponding item of the list to 0
  return[for(i of a)         // filter the list by:
          if(i)              //   item != 0 AND item != undefined
           i*2+1]            // and return each result * 2 + 1
}

वैकल्पिक, ES6 के अनुकूल समाधान (111 बाइट्स):

n=>{for(a=[i=1];i<n;a[i++]=i);for(i=0;i++<n;)for(j=0;j<n;a[i+j+++2*i*j]=0);return a.filter(x=>x).map(x=>x*2+1)}

सुझावों का स्वागत है!


0

MATLAB, 98

n=1:input('');m=n;for p=m for i=1:p j=i:p;for k=i+j+2*i*j n(n==k)=[];end;end;end;disp(2*n'+1);

और पठनीय रूप में

n=1:input(''); %Ask for the input number (e.g. 100) and form a range
m=n; %Back up the range as we will be editing 'n', but need 'm' as a loop list
for p=m %For each number between 1 and n inclusive
    for i=1:p %'i' is all numbers greater than or equal to 1 up to p
        j=i:p; %'j' is all numbers greater than or equal to i up to p
        for k=i+j+2*i*j %Calculate the numbers to remove, and loop through them
            n(n==k)=[]; %Remove that value from the 'n' array
        end
    end
end
disp([2;2*n'+1]); %An display the list including the number 2 seperated by a new line.

0

जावा 8: 168 165 बाइट्स

N->{int[]A=new int[N*N];int i=1,j;N=N/2;for(;i<N;i++)for(j=i;j<N;)A[i+j+2*i*j++]=1;System.out.println(N>1?2:\"\");for(i=1;i<N;i++)if(A[i]<1)System.out.println(2*i+1);}

अधिक बड़ी संख्या के लिए विस्तृत रेंज वाले डेटा प्रकार का उपयोग किया जा सकता है। हमें पूरे Nसूचकांक के N/2लिए पर्याप्त होने की आवश्यकता नहीं है।

ठीक से समझने के लिए समकक्ष विधि है।

static void findPrimeSundar(int N){
    int[] A = new int[N*N];
    int i=1,j;
    N=N/2;
    for(;i<N;i++)
      for(j=i;j<N;)
        A[i+j+2*i*j++]=1;
    System.out.println(N>1?2:"");
    for(i=1;i<N;i++)
        if(A[i]<1)System.out.println(2*i+ 1);
}

1
N>=2-> N>1? A[i]==0-> A[i]<1?
lirtosiast

@ThomasKwa हाँ आप सही हैं। धन्यवाद।
कोडकक्रोक

0

सीजेएम, 35 बाइट्स

2li:V,:)__2m*{_:+\:*2*+}%m2f*:)&+N*

इसे ऑनलाइन आज़माएं

यह कुछ हद तक isaacg के Pyth समाधान के सापेक्ष लंबा लगता है, लेकिन यह है ... मेरे पास क्या है।

स्पष्टीकरण:

2       Push a 2, will be part of final output.
li      Get input and convert to integer n.
:V      Save in variable V for later use.
,       Generate list [0 ... n-1].
:)      Increment list elements to get list [1 ... n].
__      Create two copies, one for sieve, and for clamping results.
2m*     Cartesian power, generating all i,k pairs.
{       Loop over all i,j pairs.
  _     Copy pair.
  :+    Calculate sum i + j.
  \     Swap copy of pair to top.
  :*    Calculate product i * j.
  2*    Multiply by 2, to get 2 * i * j.
  +     Add both values, to get i + j + 2 * i * j.
}%      End loop over all i,j pairs.
m       Sieve operation, remove the calculated values from the list of all values.
2f*     Multiply the remaining values by 2...
:)      ... and add 1 to the. We now have the list of all primes up to 2 * n + 2.
&       Intersect with [1 ... n] list, because output is only values <= n.
+       Concatenate with the 2 we pushed at the start.
N*      Join with newlines.

0

पर्ल 6 , 96 बाइट्स

यदि मैं कड़ाई से उस वर्णन का पालन करता हूं जो मुझे प्राप्त करने में सबसे छोटा है तो 96 बाइट्स हैं।

->\n {$_=@=1..n;for 1..n {for $^i..n {.[$i+$^j+2*$i*$j-1]=0}};2,|.[0..n].map(* *2+1).grep(3..n)}
->\n {
  $_=@=1..n; # initialize array
  for 1..n { # $i
    for $^i..n { # $j
      .[$i+$^j+2*$i*$j-1]=0 # remove value
    }
  };
  2,|.[0..n].map(* *2+1).grep(3..n)
}

अगर मैं 2n + 1सरणी के आरंभीकरण पर कर सकता हूं , पूर्व-सम्मिलित करना 2, और यह सीमित करना कि केवल या उससे कम मूल्यों के बराबर n; इसे 84 बाइट्स तक कम किया जा सकता है।

->\n {$_=@=2,{++$*2+1}...^*>n;for 1..n {for $^i..n {.[$i+$^j+2*$i*$j]=$}};.grep(?*)}

यदि मैं यह भी अनदेखा करता हूं कि jकम से कम माना जाता है i, तो मैं इसे 82 बाइट्स तक कम कर सकता हूं।

->\n {$_=@=2,{++$*2+1}...^*>n;for 1..n X 1..n ->(\i,\j){.[i+j+2*i*j]=$};.grep(?*)}

उदाहरण का उपयोग:

my $code = ->\n {...} # insert one of the lambdas from above

say $code(30).join(',');
# 2,3,5,7,11,13,17,19,23,29

my &code = $code;
say code 11;
# (2 3 5 7 11)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.