Fermat की बहुभुज संख्या प्रमेय


24

फर्मा बहुभुज संख्या प्रमेय कहा गया है कि हर सकारात्मक पूर्णांक अधिक से अधिक की राशि के रूप में व्यक्त किया जा सकता है n -gonal संख्या। इसका मतलब है कि हर सकारात्मक पूर्णांक तीन त्रिकोण नंबर, चार वर्ग संख्या, पांच पंचकोणीय संख्या आदि आपका काम एक सकारात्मक पूर्णांक लेने के लिए है अप करने के लिए की राशि के रूप में व्यक्त किया जा सकता है एक्स , और एक पूर्णांक रों 3 , और उत्पादन के लिए रों -जोनल पूर्णांक जो x के योग हैं ।n nxs3sx

n वें s -gonal पूर्णांक है, जहांn1 और, कई तरीकों से परिभाषित किया जा सकता। गैर-गणित-वाई तरीका यह है किवेंsgonal संख्या का निर्माण नियमित बहुभुज के रूप में किया जा सकता है जिसमेंदोनों पक्षों की लंबाई। उदाहरण के लिए,(त्रिकोणीय संख्या) के लिए:s3nssns=3

त्रिभुज

देखें यहाँ एक बड़ा के साथ उदाहरण के लिए ।s

गणित- y की परिभाषा लिए सूत्र का उपयोग करके है , जो - -gonal संख्या देता है:P(n,s)ns

P(n,s)=n2(s2)n(s4)2

जो यहाँ विकिपीडिया पृष्ठ में दिया गया है

इनपुट

दो धनात्मक पूर्णांक, और एक्स , के साथ हालत रों 3 । आप इन पूर्णांक को अपनी भाषा में सबसे अधिक प्राकृतिक प्रतिनिधित्व (दशमलव, यूनरी, चर्च अंक, पूर्णांक-मूल्यवान फ़्लोटिंग पॉइंट संख्या) में इनपुट कर सकते हैं।sxs3

उत्पादन

पूर्णांकों, की एक सूची L , की एक अधिकतम लंबाई के साथ s है, जहां का योग L के बराबर है x और में सभी पूर्णांकों L हैं s -gonal पूर्णांकों। फिर से, पूर्णांक आपकी भाषा में प्राकृतिक प्रतिनिधित्व में, किसी भी विशिष्ट, सुसंगत विभाजक (इसलिए गैर-दशमलव वर्ण (s) दशमलव आउटपुट के लिए, एक चरित्र जो कि अलग-अलग उत्पादन के लिए उपयोग किया जाता है, से अलग किया जा सकता है)

नियम

  • इनपुट या आउटपुट आपकी भाषा के लिए पूर्णांक सीमा से अधिक नहीं होंगे
  • L को आदेश नहीं देना है
  • कई संभावित आउटपुट के मामले में, कोई भी या सभी स्वीकार्य हैं
  • यह इसलिए बाइट्स जीत में सबसे छोटा कोड है

परीक्षण के मामलों

   x,  s => L
   1,  s => 1
   2,  s => 1, 1
   5,  6 => 1, 1, 1, 1, 1
  17,  3 => 1, 6, 10
  17,  4 => 1, 16
  17,  5 => 5, 12
  36,  3 => 36
  43,  6 => 15, 28
 879, 17 => 17, 48, 155, 231, 428
4856, 23 => 130, 448, 955, 1398, 1925


क्या आउटपुट में कुछ शून्य गद्दी हो सकती है? उदाहरण के लिए अगर हम विचार x=17, s=5कर सकते हैं कि हम 5,12,0,0,0सिर्फ उत्पादन कर सकते हैं 5,12?
17

@flawr इतने लंबे समय सरणी से अधिक नहीं है की लंबाई के रूप में भी गद्दी के साथ, यह है कि ठीकs
Caird coinheringaahing

क्या दोहराए जाने की अनुमति है या मुझे Qअपने सबमिशन में जोड़ना चाहिए ?
जोनाथन एलन

@JonathanAllan दोहराया आउटपुट पूरी तरह से ठीक हैं (यदि कई समाधानों का उत्पादन कर रहे हैं)
caird coinheringaahing

जवाबों:



6

जावास्क्रिप्ट (ईएस 6),  83  80 बाइट्स

एक तेज़ पुनरावर्ती खोज जो आउटपुट के सबसे छोटे शब्द को अधिकतम करती है।

के रूप में इनपुट लेता है (s)(x)

s=>g=(x,n=0,a=[],y=~n*(~-n-n*s/2))=>x<y?x|a[s]?0:a:g(x,n+1,a)||g(x-y,n,[...a,y])

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

सूत्र

जेएस में रों gonal नंबरों की गणना करने के लिए 0-आधारित सूत्र का उपयोग करने के लिए यह छोटा हो जाता है , अर्थात n=0 से शुरू करने के लिए और पी(n+1,रों) गणना करने के लिए :

पी(n+1,रों)=((n+1)2(रों-2)-(n+1)(रों-4))/2=(n2(रों-2)+nरों+2)/2=-(n+1)((n-1)-nरों/2)

जो 14 बाइट्स में लिखा जा सकता है:

~n*(~-n-n*s/2)

टिप्पणी की गई

s =>                         // main function taking s
  g = (                      // recursive function g
    x,                       // taking x
    n = 0,                   // start with n = 0
    a = [],                  // a[] = list of s-gonal numbers
    y =                      // y = P(n + 1, s)
      ~n * (~-n - n * s / 2) //   = -(n + 1) * ((n - 1) - n * s / 2)
  ) =>                       //
    x < y ?                  // if x is less than P(n + 1, s):
      x | a[s] ?             //   if x is not equal to 0 or a[] is too long:
        0                    //     failed: return 0
      :                      //   else:
        a                    //     success: return a[]
    :                        // else:
                             //   process recursive calls:
      g(x, n + 1, a) ||      //   preferred: try to increment n
      g(x - y, n, [...a, y]) //   fallback : try to use the current s-gonal number

@AZTECCO मैं इसे बाद में ठीक करने का प्रयास कर सकता हूं। अभी के लिए निकाला गया।
अरनुलद

धन्यवाद। इसके लिए प्रतीक्षा कर रहा हूँ!
AZTECCO


4

हास्केल , 55 बाइट्स

n%s=[l|l<-mapM(\_->scanl(+)0[1,s-1..n])[1..s],sum l==n]

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

सभी संभव समाधान आउटपुट। अंक-गतिक संख्या को अंकगणितीय प्रगति के संचयी योग के रूप में परिभाषित करता है

1, s-2, 2*s-3, 3*s-4, ...

3

जेली , 17 बाइट्स

x’2;’ÄÄx⁸ŒPS⁼¥Ƈ⁹Ḣ

ए (बहुत ही अकुशल) डाइएडिक लिंक sजो बाईं ओर और xदाईं ओर स्वीकार करता है जो पूर्णांकों की सूची के रूप में सबसे कम संभव उत्तर देता है (क्रमबद्ध आरोही)।

इसे ऑनलाइन आज़माएं! - यह बहुत अधिक मूल्यों के लिए कोशिश कर रहा बिंदु नहीं है!

कैसे?

x’2;’ÄÄx⁸ŒPS⁼¥Ƈ⁹Ḣ - Link: s, x                    e.g.  5, 17
x                 - repeat (s) (x) times                [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
 ’                - decrement (vectorises)              [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
  2;              - prepend a two                       [2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
    ’             - decrement (vectorises)              [1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
     Ä            - cumulative sums                     [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52]
      Ä           - cumulative sums                     [1, 5, 12, 22, 35, 51, 70, 92, 117, 145, 176, 210, 247, 287, 330, 376, 425, 477]
       x⁸         - repeat (each of those) (s) times    [1, 1, 1, 5, ..., 425, 477, 477, 477]
         ŒP       - power-set                           [[], [1], [1], ..., [1, 1], ..., [5, 22, 70], ... etc]
                      (this has 2^(x(s+1)) entries ...this example would have 2^(17(5+1)) = 2^102 = 5070602400912917605986812821504 entries!)
                      (Note: the lengths increase left to right)
              Ƈ   - filter keep if:
             ¥    -   last two links as a dyad:
           S      -     sum
            ⁼  ⁹  -     equals (x)?                     [[5,12], ... , [5,12], [1, 1, 5, 5, 5], ... , [1, 1, 5, 5, 5], [1, 1, 1, 1, 1, 12], ...]
                Ḣ - head                                [5,12]

@AZTECCO यह पूरी तरह से ठीक है, यह टीआईओ पर 60 सेकंड पर कई बार निकलता है (मुझे पूरा यकीन है कि इससे भी छोटा इनपुट नंबर होगा जो समय समाप्त हो जाएगा)। जैसा कि मैंने अपने उत्तर में बताया है, यह "बहुत ही अक्षम" है और यह "बहुत अधिक मूल्यों के लिए प्रयास करने की बात नहीं है!"। याद रखें, एक कोड-गोल्फ समाधान के लिए दिए गए कोड को केवल अनंत संसाधनों को दिए गए काम की आवश्यकता होती है।
जोनाथन एलन

ठीक है मैंने s = 3 और n = 5 के साथ परीक्षण किया और इसमें 12 सेकंड लगे !! मुझे यह अकुशल समाधान पसंद है और मैं आप पर भरोसा करूंगा, भले ही इसका परीक्षण करना लगभग असंभव हो :) धन्यवाद!
AZTECCO

1
एक्सरों



2

रेटिना , 111 बाइट्स

\d+
*
~(`$
$"
0%["^_+ "|""]'$L$`\G_(?<=(?=___(_*))_+)
((_(?($.(2*$>`))$1\$.(2*$>`)))$*)
1%|' L$`\G_
$$.$.($`$>`

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण के मामले शामिल हैं। आदेश में इनपुट लेता है s n। स्पष्टीकरण:

\d+
*

यूनीरी में बदलें।

~(`

शेष चरणों को संसाधित करने के बाद, उन्हें रेटिना प्रोग्राम के रूप में मानें और उन्हें उसी इनपुट पर निष्पादित करें।

$
$"

लाइन डुप्लिकेट करें।

0%["^_+ "|""]'$L$`\G_(?<=(?=___(_*))_+)
((_(?($.(2*$>`))$1\$.(2*$>`)))$*)

पहली कॉपी को एक रेगुलर एक्सप्रेशन के साथ बदलें, जो पहले नंबर पर s sस्केच करता है और फिर -गोनल नंबर से मेल खाता है । संख्याओं को स्वयं अजीब कैप्चर समूहों में कैप्चर किया जाता है और यहां तक ​​कि कैप्चर समूहों का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि सभी संख्याएँ s-gonal हैं।

1%|' L$`\G_
$$.$.($`$>`

दूसरी प्रतिलिपि को विषम कैप्चर समूहों की एक अलग-अलग सूची के साथ बदलें।

एक उदाहरण के रूप में, एक इनपुट के लिए उत्पन्न कोड 5 17निम्नानुसार है:

^_+ ((_(?(2)__\2))*)((_(?(4)__\4))*)((_(?(6)__\6))*)((_(?(8)__\8))*)((_(?(10)__\10))*)$
$.1 $.3 $.5 $.7 $.9

1

एपीएल (एनएआरएस), 149 चार्ट, 298 बाइट्स

r←f w;n;s;i;k
(n s)←w⋄r←⍬⋄→0×⍳s<3⋄i←1
→0×⍳n<k←2÷⍨(i×i×s-2)-i×s-4⋄r←r,k⋄i+←1⋄→2

h←{0=≢b←((v←↑⍵)=+/¨a)/a←{0=≢⍵:⊂⍬⋄m,(⊂1⌷⍵),¨m←∇1↓⍵}f⍵:v⍴1⋄k←↑⍋≢¨b⋄k⊃b}

यदि समाधान नहीं मिल रहा है तो "0 = "b" इनपुट (ns) के बदले में, n बार 1; अन्यथा यह उन संख्याओं का योग लौटाएगा जिनकी संख्या कम है ...

परीक्षा:

  h 1 3
1 
  h 2 8
1 1 
  h 5 6
1 1 1 1 1 
  h 17 3
1 6 10 
  h 17 4
1 16 
  h 17 5
5 12 
  h 36 3
36 
  h 43 6
15 28 
  h 879 17
17 48 155 231 428 
  h 4856 23
321 448 596 955 2536 
  +/h 4856 23
4856

इस की समस्या: यह कुछ समाधान नहीं है राशि में कुछ संख्या को दोहराने ...


0

सी ++ (क्लैंग) , 198 बाइट्स

#import<vector>
using V=std::vector<int>;V f(int n,int s){V _{0};int z=1,a=0,b=1,i,t;for(;a<n;b+=s-2)_.push_back(a+=b),++z;V o;for(t=a=0;t-n;b=++a)for(o=V(s),t=i=0;b;b/=z)t+=o[i++]=_[b%z];return o;}

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

V=vector<int> 
V _{0}; // initialized with one element =0 
int z=1, // vector size 
a=0,b=1,i,t;for(;a<n;b+=s-2)_.push_back(a+=b),++z;
// pushes polygons in V
V o; // vector to be returned 
for(t=a=0;t-n;b=++a) // ends when t=n
// loop to generate multi-dimension indexes
// for example a=1234 z=10
// a%z->4 , a/=z , a%z-> 3 , ... 2 , 1
for(o=V(s),t=i=0;b;b/=z)// loop to extract indexes
t+=o[i++]=_[b%z]; // put the sum in t and values in o
return o
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.