CJam (69 बाइट्स)
]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z
ऑनलाइन डेमो
व्याख्या
मूल विचार OEIS में वर्णित उत्पादक फ़ंक्शन को लागू करना है। इनपुट एक बुरा विशेष मामला है, लेकिन मैंने जो अंतिम ट्वीक्स तैयार किए हैं, उनका उत्पादन - 1 उस मामले के लिए किया गया है, इसलिए z (निरपेक्ष मूल्य के लिए) इसे ख़त्म करता है। यह यहाँ की अजीब चाल है।0- 1z
.*:+
तीन बार दोहराया जाता है, और ऐसा लगता है कि अगर इसे निकाला जाए तो यह बाइट को बचा सकता है {.*:+}:F~
। हालांकि, यह विशेष केस टूटता है , क्योंकि यह बाहरी लूप को बिल्कुल भी निष्पादित नहीं करता है।0
हम A000081 के लिए सहायक उत्पादक फ़ंक्शन का उपयोग करते हैं , जिनकी शर्तों की पुनरावृत्ति होती है
a[0] = 0
a[1] = 1
For n >= 1, a[n+1] = (sum_{k=1}^n a[n-k+1] * sum_{d|k} d * a[d]) / n
मैं बदलना सुनिश्चित करें कि कुछ भाषाओं का निर्माण-इन हैं हूँ मॉबियस उलटा के लिए , लेकिन CJam नहीं करता है, मुझे मिला सबसे अच्छा तरीका एक सरणी मानचित्रण d बनाना हैΣघ∣ केघ× [ a d]घ करने के लिए k % d == 0 ? d : 0
और उसके बाद के साथ एक pointwise गुणा करना का उपयोग कर । नोट यह सुविधाजनक है कि यहाँ बनाया है करने के लिए एक सूचकांक 1 से शुरू, क्योंकि हम शून्य से बचने के विभाजन करना चाहते हैं जब वजन की स्थापना। यह भी ध्यान दें कि यदि पॉइंटवाइज ऑपरेशन को आपूर्ति की गई दो सरणियां समान लंबाई नहीं हैं, तो लंबे समय तक के मानों को छोड़ दिया जाता है: इसलिए हमें या तो पहले k की शर्तों को लेना होगाए.*
एक या वजन की सरणी तक जा कर एन । बाद वाला छोटा लगता है। तो यह उलटा Möbius के लिए खातों को बदलनाएnN\f{1$%!*}W$.*:+
यदि हम प्रतिलोम मोबियस परिवर्तन के परिणाम को कहते हैं M
, तो हमारे पास अब
एक [ n + 1 ] = 1nΣके = १nएक [ एन - कश्मीर + 1 ] × एम[ के ]
अंशांकक स्पष्ट रूप से एक शब्द है, इसलिए हम इसे या तो या एम की एक प्रति को उल्टा करके और फिर एक बिंदुवार गुणा और योग लेते हुए संभाल सकते हैं । फिर, हमारा सूचकांक 1 से n तक भिन्न होता हैएम1n , और इसके अलावा में हम सूचकांक करने के लिए जो राशि जोड़ी करना चाहते हैं , तो यह सूचकांक करने के लिए फिर से सुविधाजनक है एक हम अब के लिए जिम्मेदार किया है 1 के बजाय 0. सेएन + १ए
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/
सहायक जनरेटिंग फंक्शन का बिंदु A000055 के सूत्र अनुभाग द्वारा दिया गया है:
G.f.: A(x) = 1 + T(x) - T^2(x)/2 + T(x^2)/2,
where T(x) = x + x^2 + 2*x^3 + ... is the g.f. for A000081.
के संदर्भ में , इस का मतलब है उत्पादन हम तलाश है कि [ x = 0 ] + एक [ एक्स ] + 1ए
[ x = ० ] + एक [ x ] + १2( एक [ एक्स / 2 ] - Σमैं = ०nएक [ मैं ] × एक [ एन - मैं ] )
एक [ एक्स / 2 ]एक्स1,*
X=
0\+
एक [ ० ] = ०एक्स= 0W\+
- 2 एक [ एक्स ] + Σnमैं = ०एक [ मैं ] × एक [ एन - मैं ]2एक [ x ]
तो हमने समझाया है
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/
शेष विवरण विशेष मामले से संबंधित हैं। मैंने मूल रूप से पुनरावृत्ति का सख्ती से पालन करना शुरू किया1]
एन= 1
1]qi:X,1>{ ... }/
एक्स= 0ए[-1 1]
0[ x = ० ]X!+
1e|
ए1एन= 0
]qi:X,{ ... /+}/
स्पष्ट रूप से शून्य से विभाजन देता है। लेकिन अगर हम कोशिश करें
]qi:X,{1e| ... /+}/
तब यह काम करता है। हमें मिला
e# Stack: [] 0
1e| e# Stack: [] 1
,:):N e# Stack: [] [1]
{ e# We only execute this loop once
N\f{1$%!*} e# 1 divides 1, so stack: [] [1]
W$.* e# Remember: if the two arrays supplied to the pointwise operation
e# are not the same length then the values from the longer one are
e# left untouched. Stack: [] [1]
:+ e# Fold over a singleton. Stack: [] 1
}% e# And that was a map, so stack: [] [1]
1$W%.*:+ e# Another [1] [] .*:+, giving the same result: 1
N,/ e# 1 / 1 = 1
+ e# And we append 1 to a giving [1]
जो हमारे लिए आवश्यक मूल्य का उत्पादन करता है।
एक्स= 0- 1[-1]
( - 1 - 12( - 1 × - 1 ) ) = - 101- 11 केवल एक लेता है: z
पूर्ण मूल्य देता है।