2010-10-18 10 views
13

के लिए कंप्यूटर बीजगणित लघु संस्करण: मुझे कुछ क्लोजर कोड में दिलचस्पी है जो मुझे एक्स (जैसे क्रमपरिवर्तन, घूर्णन) के परिवर्तनों को निर्दिष्ट करने की अनुमति देगा जिसके अंतर्गत फ़ंक्शन f (x) का मान invariant है, ताकि मैं कुशलतापूर्वक एक्स के अनुक्रम उत्पन्न कर सकता हूं जो आर = एफ (एक्स) को संतुष्ट करता है। क्लोजर के लिए कंप्यूटर बीजगणित में कुछ विकास है? (एक छोटी सी) उदाहरणक्लोजर

(defn #^{:domain #{3 4 7} 
     :range #{0,1,2} 
     :invariance-group :full} 
      f [x] (- x x)) 

मैं कह सकते हैं के लिए (preimage च # {0}) और यह कुशलतापूर्वक वापसी होगी # {3 4 7}। स्वाभाविक रूप से, यह कोडोडन को सही ढंग से एनोटेट करने में भी सक्षम होगा। कोई सुझाव?

लंबा संस्करण: मुझे एक विशिष्ट समस्या है जो मुझे क्लोजर के लिए कंप्यूटर बीजगणित के विकास के बारे में जानने में रूचि रखती है। क्या कोई मुझे इस तरह के एक परियोजना के लिए इंगित कर सकते हैं? मेरी विशिष्ट समस्या में उन शब्दों के सभी संयोजनों को ढूंढना शामिल है जो एफ (x) = r को संतुष्ट करते हैं, जहां एफ रैंकिंग फ़ंक्शन है और एक सकारात्मक पूर्णांक है। मेरे विशेष मामले में एफ को

एफ (x) = f (x [0]) + f (x [1]) + ... f (x [N-1])

के रूप में गणना की जा सकती है

इसके अलावा मेरे पास अलग-अलग सेट एस = {s_i} का सेट है, जैसे कि f (a) = f (b) ए, बी में एस, एस में एस। तो सभी एक्स उत्पन्न करने की एक रणनीति जैसे कि एफ (एक्स) = आर को एफ के इस कारक पर भरोसा करना चाहिए और प्रत्येक s_i के तहत f का आविष्कार होना चाहिए। शब्दों में, मैं उन साइटों के सभी क्रमपरिवर्तनों की गणना करता हूं जिनमें एस के तत्व होते हैं जो कि योग को जोड़ते हैं और उन्हें प्रत्येक s_i में तत्वों के सभी संयोजनों के साथ लिखें। यह निम्न में काफी ढीली किया जाता है:

(use 'clojure.contrib.combinatorics) 
(use 'clojure.contrib.seq-utils) 


(defn expand-counter [c] 
(flatten (for [m c] (let [x (m 0) y (m 1)] (repeat y x))))) 

(defn partition-by-rank-sum [A N f r] 
    (let [M (group-by f A) 
    image-A (set (keys M)) 
    ;integer-partition computes restricted integer partitions, 
    ;returning a multiset as key value pairs 
    rank-partitions (integer-partition r (disj image-A 0)) 
    ] 
    (apply concat (for [part rank-partitions] 
     (let [k (- N (reduce + (vals part))) 
      rank-map (if (pos? k) (assoc part 0 k) part) 
      all-buckets (lex-permutations (expand-counter rank-map)) 
      ] 
      (apply concat (for [bucket all-buckets] 
     (let [val-bucket (map M bucket) 
       filled-buckets (apply cartesian-product val-bucket)] 
      (map vec filled-buckets))))))))) 

यह काम किया हो जाता है लेकिन अंतर्निहित चित्र याद करते हैं। उदाहरण के लिए, यदि सहयोगी ऑपरेशन एक योग के बजाय एक उत्पाद था तो मुझे भागों को फिर से लिखना होगा।

+0

2013 से [Expresso] (https://github.com/clojure-numerics/expresso) देखें। – Zaz

उत्तर

1

मुझे क्लोजर में लिखे गए किसी भी कंप्यूटर बीजगणित सिस्टम से अनजान है। हालांकि, मेरी अपेक्षाकृत सरल गणितीय जरूरतों के लिए मुझे Maxima का उपयोग करने में अक्सर उपयोगी लगता है, जो लिस्प में लिखा गया है। एस-एक्सप्रेशन या उच्च स्तरीय प्रतिनिधित्वों का उपयोग करके मैक्सिमा से बातचीत करना संभव है, जो वास्तव में सुविधाजनक हो सकता है। मैक्सिमा में कुछ मौलिक संयोजक कार्य भी हैं जो आप जो खोज रहे हैं वह हो सकता है।

यदि आप क्लोजर का उपयोग करने में नरक हैं, तो अल्पावधि में शायद आपके डेटा को मैक्सिमा और क्लोजर के बीच आगे फेंकने से आपको अपने लक्ष्यों को प्राप्त करने में मदद मिलेगी।

लंबी अवधि में, मुझे यह देखने में दिलचस्पी होगी कि आप किस चीज के साथ आते हैं!

2

वहाँ Clojuratica, Clojure और मेथेमेटिका के बीच एक अंतरफलक है:

http://clojuratica.weebly.com/

भी इस mailing list post देखें Clojuratica के लेखक द्वारा।

जबकि कोई सीएएस नहीं है, Incanter में कई बहुत अच्छी सुविधाएं भी हैं और आपके विचारों को बनाने के लिए एक अच्छा संदर्भ/नींव हो सकती है।

के संबंध में "उदाहरण के लिए, यदि सहयोगी ऑपरेशन राशि के बजाय एक उत्पाद था तो मुझे भागों को फिर से लिखना होगा।": यदि आप तदनुसार अपना कोड तैयार करते हैं, तो क्या आप उच्च-आदेश कार्यों का उपयोग करके और सहयोगी संचालन में गुजरकर इसे पूरा नहीं कर पाएंगे? मानचित्र-कम सोचें।

1

नीचे दी गई प्रणाली अभी भी संयोजक का समर्थन नहीं करती है, हालांकि यह उन्हें जोड़ने का एक बड़ा प्रयास नहीं होगा, अच्छे कोड का भार पहले से मौजूद है, और यह इसे बनाने के लिए एक अच्छा मंच हो सकता है, क्योंकि मूल बातें बहुत अच्छी हैं । मुझे आशा है कि एक छोटी प्लग यहाँ अनुचित नहीं है, यह केवल गंभीर Clojure कैस मैं के बारे में पता है, लेकिन हे, क्या एक प्रणाली ...

=======

यह रुचि का हो सकता है इस धागे के पाठकों के लिए कि गेरी सुस्मान के scmutils सिस्टम क्लोजर को पोर्ट किया जा रहा है। यह एक बहुत ही उन्नत सीएएस है, जो मेपल की शैली में स्वचालित भेदभाव, शाब्दिक कार्य, आदि जैसी चीजें प्रदान करता है। इसका उपयोग गतिशीलता और अंतर ज्यामिति पर उन्नत कार्यक्रमों के लिए एमआईटी में किया जाता है, और इलेक्ट्रिकल इंजीनियरिंग सामान का एक उचित हिस्सा है। यह भी SICP, SICM (संरचना और क्लासिकल यांत्रिकी की व्याख्या) के लिए Sussman & बुद्धि के "अगली कड़ी" (LOL) में इस्तेमाल प्रणाली है। मूल रूप से एक योजना कार्यक्रम हालांकि, यह प्रत्यक्ष अनुवाद नहीं है, लेकिन क्लोजर की सर्वोत्तम सुविधाओं का लाभ उठाने के लिए एक ग्राउंड-अप पुनर्लेखन है। इसे sicmutils नाम दिया गया है, दोनों मूल और पुस्तक के सम्मान में यह शानदार प्रयास कॉलिन स्मिथ का काम है और आप इसे https://github.com/littleredcomputer/sicmutils पर पा सकते हैं।

मुझे विश्वास है कि यह क्लोजर के लिए एक अद्भुत कंप्यूटर बीजगणित प्रणाली का आधार बन सकता है, जो कि उपलब्ध कुछ भी के साथ प्रतिस्पर्धी है। यद्यपि यह बहुत बड़ा जानवर है, जैसा कि आप कल्पना कर सकते हैं, और सामानों की बहुत सारी चीज़ें बनी रहती हैं, मूल बातें वहां बहुत अधिक हैं, सिस्टम अलग-अलग होगा, और शाब्दिक और शाब्दिक कार्यों को अच्छी तरह से संभालेगा। यह प्रगति में एक काम है। यह प्रणाली सुस्मान द्वारा समर्थित "जेनेरिक" दृष्टिकोण का भी उपयोग करती है, जिससे संचालन कार्यों पर लागू किया जा सकता है, जिससे एक महान अमूर्तता उत्पन्न हो जाती है जो नोटेशन को समाप्त नहीं करती है।

> (def unity (+ (square sin) (square cos))) 
> (unity 2.0) ==> 1.0 
> (unity 'x) ==> 1 ;; yes we can deal with symbols 
> (def zero (D unity)) ;; Let's differentiate 
> (zero 2.0) ==> 0 

SicmUtils दो नए वेक्टर प्रकार "ऊपर" का परिचय और "नीचे" (बुलाया "संरचनाओं"), वे काफी काम के रूप में आप वैक्टर की उम्मीद करेंगे, लेकिन कुछ विशेष है:

यहाँ एक टाइस्टर है गणितीय (covariant, contravariant) गुण, और कुछ प्रोग्रामिंग गुण, कि वे निष्पादन योग्य हैं!

> (def fnvec (up sin cos tan)) => fnvec 
> (fnvec 1) ==> (up 0.8414709848078965 0.5403023058681398 1.5574077246549023) 
> ;; differentiated 
> ((D fnvec) 1) ==> (up 0.5403023058681398 -0.8414709848078965 3.425518820814759) 
> ;; derivative with symbolic argument 
> ((D fnvec) 'θ) ==> (up (cos θ) (* -1 (sin θ)) (/ 1 (expt (cos θ) 2))) 

आंशिक भेदभाव पूरी तरह से समर्थित है

> (defn ff [x y] (* (expt x 3)(expt y 5))) 
> ((D ff) 'x 'y) ==> (down (* 3 (expt x 2) (expt y 5)) (* 5 (expt x 3) (expt y 4))) 
> ;; i.e. vector of results wrt to both variables 

प्रणाली भी टेक्स उत्पादन, बहुपद गुणन, और अन्य उपहार के एक मेजबान का समर्थन करता है। हालांकि, बहुत सी चीजें जिन्हें आसानी से कार्यान्वित किया जा सकता है, पूरी तरह से मानव संसाधनों की कमी से नहीं किया गया है। ग्राफिक आउटपुट और "नोटपैड/वर्कशीट" इंटरफ़ेस (क्लोजर के गोरिल्ला का उपयोग करके) पर भी काम किया जा रहा है।

मुझे उम्मीद है कि यह साइट पर जाने और इसे एक भंवर देने के लिए पर्याप्त भूख को घुमाने की दिशा में कुछ रास्ता तय कर चुका है। आपको क्लोजर की भी आवश्यकता नहीं है, आप इसे प्रदान की गई जार फ़ाइल से चला सकते हैं।