রাকু ব্যবহার করে ই নম্বর গণনা করা হচ্ছে


9

আমি সূত্রটি গণনা করে ধ্রুবক ( একে একে ইউলারের নম্বর ) গণনা করার চেষ্টা করছিই

এক শটে ফ্যাক্টরিয়াল এবং বিভাগ গণনা করার জন্য, আমি এটি লিখেছি:

my @e = 1, { state $a=1; 1 / ($_ * $a++) } ... *;
say reduce  * + * , @e[^10];

তবে এটি কার্যকর হয়নি। কীভাবে এটি সঠিকভাবে করবেন?


কীভাবে এটি করেছে: "এটি কার্যকর হয়নি"?
শেরিলহোমান

1
নমুনা কোডের ডিনোমিনেটর অংশটি কার্যকর হয় নি কারণ এটি ফ্যাক্টরিয়ালটি তৈরির প্রয়াসে পূর্ববর্তী মান $_ ভেরিয়েবলটি ব্যবহার করছিল । এটা স্পষ্টত অনর্থক ছিল। নীচের সঠিক সমাধানে, $_বাদ দেওয়া হয়েছিল এবং এটি পুরোপুরি কার্যকর হয়েছিল।
লার্স মলমসটিন

ধন্যবাদ। আমার ধারণা, আমি এই বক্তব্যটির দ্বারা ঠিক কী বোঝাতে চাইছিলাম তার জন্য আরও সন্ধান করছিলাম। যেমন একটি ত্রুটি ছিল, কীভাবে আপনি প্রত্যাশা করছিলেন তার সাথে সামঞ্জস্য ছিল না, এই ধরণের জিনিস। আমার ধারণা, আপনার গণনা সেই গণনার জন্য পরিচিত উত্তরগুলির সাথে মেলে না। ভাল লাগছে আপনি এটি কাজ পেয়েছিলাম !! এছাড়াও, আসল সমস্যাটি কী ছিল তা সম্পর্কে দুর্দান্ত উত্তর-উত্তর বর্ণনা :-)
শেরিলহোমান 21

উত্তর:


11

আমি আপনার কোড বিশ্লেষণ বিভাগে আপনার কোড বিশ্লেষণ । এর আগে আমি বোনাস উপাদানের কয়েকটি মজাদার অংশ উপস্থাপন করি।

ওয়ান লাইনার ওয়ান লেটার 1

say e; # 2.718281828459045

"একাধিক উপায়ে একটি গ্রন্থ" 2

eরাকুতে কম্পিউটিং নিয়ে দামিয়ান কনওয়ের অসাধারণ নিবন্ধটি দেখতে উপরের লিঙ্কটিতে ক্লিক করুন ।

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

একটি ক্ষুধার্ত হিসাবে, নিবন্ধটি প্রায় অর্ধেক থেকে একটি উদ্ধৃতি এখানে:

এই দক্ষ পদ্ধতিগুলি সমস্ত একইভাবে কাজ করে দেওয়া হয় terms সংক্ষিপ্ত আকারের একটি প্রাথমিক উপসেট (একটি প্রাথমিক উপসেট) শর্তাদির দ্বারা - সম্ভবত আমাদের পক্ষে এটি করার কোনও ফাংশন থাকলে হয়তো আরও ভাল হত। এবং অবশ্যই এটি আরও ভাল হবে যদি ক্রিয়াকলাপটি নিজেই সঠিকভাবে উত্তর তৈরি করার জন্য সিরিজের সেই প্রাথমিক উপসেটটির কতটুকু অন্তর্ভুক্ত হওয়া প্রয়োজন তার চেয়ে সঠিকভাবে কাজ করতে পারত ... বরং ফলাফলের মাধ্যমে ম্যানুয়ালি আঁচড়ানোর প্রয়োজন আমাদের থেকে better এটি আবিষ্কার করার জন্য একাধিক ট্রায়াল।

এবং, রাকুতে প্রায়শই, আমাদের যা প্রয়োজন ঠিক তা তৈরি করা আশ্চর্যরকম সহজ:

sub Σ (Unary $block --> Numeric) {
  (0..∞).map($block).produce(&[+]).&converge
}

আপনার কোড বিশ্লেষণ

সিরিজ উত্পন্ন করার জন্য এখানে প্রথম লাইন রয়েছে:

my @e = 1, { state $a=1; 1 / ($_ * $a++) } ... *;

বন্ধ ( { code goes here }) একটি পদ গণনা করে। একটি বন্ধের একটি স্বাক্ষর থাকে, হয় অন্তর্নিহিত বা সুস্পষ্ট, এটি নির্ধারণ করে যে এটি কত যুক্তি গ্রহণ করবে। এক্ষেত্রে সুস্পষ্ট স্বাক্ষর নেই। ব্যবহারের $_( "TOPIC" পরিবর্তনশীল ) একজন অন্তর্নিহিত স্বাক্ষর যে এক যুক্তি হল যে আবদ্ধ প্রয়োজন ফলাফল $_

সিকোয়েন্স অপারেটর ( ...) বারবার তার বাম দিকে ক্লোজারটিকে ডেকে আনে এবং আগের শব্দটিকে ক্লোজারের যুক্তি হিসাবে অতিক্রম করে ডানদিকে ডান দিকের প্রান্ত বিন্দু অবধি অবিচ্ছিন্ন শর্ত তৈরি করতে , যা এই ক্ষেত্রে হ'ল ওরফে অনন্তের *জন্য শর্টহ্যান্ড Inf

বন্ধের প্রথম কলের বিষয়টি হ'ল 1। সুতরাং ক্লোজার গণনা এবং 1 / (1 * 1)সিরিজ হিসাবে প্রথম দুটি পদ ফলন দেয় 1, 1/1

মধ্যে বিষয় দ্বিতীয় কল আগের মান, 1/1, IE 1আবার। সুতরাং ক্লোজার গণনা এবং রিটার্ন 1 / (1 * 2), সিরিজটি প্রসারিত করে 1, 1/1, 1/2। এটি সব ভাল দেখাচ্ছে।

পরবর্তী ক্লোজারগুলি 1 / (1/2 * 3)যা হয় 0.666667। সেই পদটি হওয়া উচিত 1 / (1 * 2 * 3)। উফ।

আপনার কোডটি সূত্রের সাথে মেলে

আপনার কোডটি সূত্রের সাথে মিলবে বলে মনে করা হচ্ছে:
ই

এই সূত্রে, প্রতিটি পদটি সিরিজের অবস্থানের ভিত্তিতে গণনা করা হয় । ম সিরিজের (যেখানে শব্দটি = 0 প্রথম 1) শুধু গৌণিক হয় এর পারস্পরিক।

(সুতরাং এটি পূর্বের পদটির মানের সাথে কিছুই করার ছিল না Thus সুতরাং $_, যা পূর্ববর্তী পদটির মান পায় , এটি বন্ধে ব্যবহার করা উচিত নয়))

আসুন একটি ফ্যাক্টরিয়াল পোস্টফিক্স অপারেটর তৈরি করুন:

sub postfix:<!> (\k) { [×] 1 .. k }

( ×একটি ইনফিক্স গুণ গুণান্বিত অপারেটর, সাধারণ এএসসিআইআই ইনফিক্সের ভাল লাগার ইউনিকোড ওরফে* ))

এটি সংক্ষেপে:

sub postfix:<!> (\k) { 1 × 2 × 3 × .... × k }

(আমি ব্রেসগুলির অভ্যন্তরে সিউডো মেটাসেণ্ট্যাকটিক স্বরলিপি ব্যবহার করেছি যাতে প্রয়োজনীয় হিসাবে অনেক পদ যুক্ত বা বিয়োগের ধারণাটি বোঝায়।

আরও সাধারণভাবে, opএক্সপ্রেশনের শুরুতে একটি ইনফিক্স অপারেটর বর্গাকার বন্ধনীগুলিতে স্থাপন করা একটি সংমিশ্রিত উপসর্গ অপারেটর গঠন করে যা এর সমতুল্য reduce with => &[op],। আরও তথ্যের জন্য হ্রাস মেটাওপ্রেটর দেখুন ।

নতুন ফ্যাকটোরিয়াল পোস্টফিক্স অপারেটরটি ব্যবহার করতে এখন আমরা ক্লোজারটি পুনরায় লিখতে পারি:

my @e = 1, { state $a=1; 1 / $a++! } ... *;

বিঙ্গো। এটি সঠিক সিরিজ উত্পাদন করে।

... যতক্ষণ না এটি ঘটায়, অন্য কারণে পরবর্তী সমস্যাটি হ'ল সংখ্যার যথাযথতা। তবে এর সামনের অংশে এটি মোকাবেলা করা যাক।

আপনার কোড থেকে প্রাপ্ত একটি লাইনার

তিনটি লাইন একটিকে সংকুচিত করুন:

say [+] .[^10] given 1, { 1 / [×] 1 .. ++$ } ... Inf

.[^10]প্রযোজ্য বিষয়টিতে, যা দ্বারা সেট করা হয়েছে given। (এর ^10জন্য সংক্ষিপ্তকরণ 0..9, সুতরাং উপরের কোডটি সিরিজের প্রথম দশ পদগুলির যোগফলকে গণনা করে))

আমি $aক্লোজার কম্পিউটারটিকে পরের শব্দটি থেকে মুছে ফেলেছি । একাকী $হ'ল (state $)অ্যানোনিয়াস স্ট্যাটাল স্কেলার as আমি এটি একটি প্রাক বৃদ্ধি পরিবর্তে পরবর্তী বৃদ্ধি একই প্রভাব অর্জন হিসাবে আপনি আরম্ভের দ্বারা করেনি প্রণীত $aকরতে 1

আমরা এখন চূড়ান্ত (বড়!) সমস্যাটি রেখে এসেছি, নীচের মন্তব্যে আপনার দ্বারা নির্দেশিত।

প্রদত্ত এর অপারেশনগুলির কোনওটিই একটি Num(একটি ফ্লোট এবং আনুমানিক), /অপারেটর সাধারণত একটি 100% নির্ভুল Rat(একটি সীমাবদ্ধ নির্ভুল যুক্তিযুক্ত) প্রদান করে। তবে যদি ফলাফলটির ডিনোমিনেটর b৪ বিট অতিক্রম করে তবে ফলাফলটি একটিতে রূপান্তরিত হয় Num- যা নির্ভুলতার জন্য পারফরম্যান্সের ব্যবসা করে, এমন ট্রেড অফ যা আমরা তৈরি করতে চাই না। আমাদের তা আমলে নেওয়া দরকার।

সীমাহীন নির্ভুলতার পাশাপাশি 100% নির্ভুলতা নির্দিষ্ট করতে , কেবলমাত্র অপারেশনকে FatRatএস ব্যবহার করতে বাধ্য করুন । এটি সঠিকভাবে করতে, কেবল (কমপক্ষে) অপারেটরগুলির একটি হ'ল FatRat(এবং অন্য কেউ নয় Num):

say [+] .[^500] given 1, { 1.FatRat / [×] 1 .. ++$ } ... Inf

আমি এটি 500 দশমিক সংখ্যায় যাচাই করেছি। আমি আশা করি রাকু ভাষা বা রাকুডো সংকলকের কিছু সীমা অতিক্রম করার কারণে প্রোগ্রামটি ক্র্যাশ না হওয়া পর্যন্ত এটি সঠিক থাকবে। (এর কিছু আলোচনার জন্য আমার উত্তরটি 65536 বিট প্রশস্ত বিগিন্টকে দেশীয় পূর্ণসংখ্যায় আনবক্স করতে পারবেন না )

পাদটিকা

1 Raku কয়েকটি গুরুত্বপূর্ণ গাণিতিক ধ্রুবক মধ্যে সহ বিল্ট ইন আছে e, iএবং pi(এবং তার ওরফে π)। এইভাবে কেউ রাকুতে অলারের পরিচয় লিখতে পারেন যেমন এটি গণিতের বইয়ের মতো লাগে। ইউলারের পরিচয়ের জন্য রোসেটা কোডের রাকু প্রবেশের কৃতিত্বের সাথে :

# There's an invisible character between <> and i⁢π character pairs!
sub infix:<⁢> (\left, \right) is tighter(&infix:<**>) { left * right };

# Raku doesn't have built in symbolic math so use approximate equal 
say e**i⁢π + 1 ≅ 0; # True

2 দামিয়ানের নিবন্ধটি অবশ্যই পড়তে হবে। তবে এটি কেবল বেশ কয়েকটি প্রশংসনীয় চিকিত্সার মধ্যে একটি যা 'রাকু "ইউলারের নম্বর" "এর জন্য কোনও গুগলের 100+ মিলের মধ্যে রয়েছে ।

3 দেখুন TIMTOWTDI বনাম TSBO-APOO-OWTDI TIMTOWTDI আরো সুষম মতামত পাইথন একটি পাখা দ্বারা লিখিত একটির জন্য। কিন্তু হয় অতিদূরে TIMTOWTDI নেওয়ার মূল্যবান। এই "বিপদ" প্রতিফলিত করার জন্য, পার্ল সম্প্রদায়টি হাস্যকরভাবে দীর্ঘ, অপঠনযোগ্য এবং সংক্ষেপিত টিমটোউডিআইডিএসসিএনএবিটি - এটি করার একাধিক উপায় আছে তবে কখনও কখনও ধারাবাহিকতা খারাপ কাজ হয় না, উচ্চারিত হয় "টিম টোডি বাইকার্বোনেট"। আশ্চর্যজনকভাবে যথেষ্ট , ল্যারি রাকুর ডিজাইনে বাইকার্বোনেট প্রয়োগ করেছিলেন এবং ডামিয়ান এটি eরাকুতে কম্পিউটিংয়ে প্রয়োগ করেছেন ।


উত্তরের জন্য ধন্যবাদ. আপনার পথে ভিত্তিক আমার পথ শিরোনামে বিভাগটি এটি বেশ ভাল সমাধান করে। যদিও আমার জটিলতাগুলি সন্ধান করা উচিত। আমি জানতাম না যে একটি সমভূমি $একটি শর্টহ্যান্ড ছিল state $, এটি বেশ সহজ।
লার্স ম্যালমস্টিন

eতৃতীয় সমাধানের জন্য অঙ্কগুলির সংখ্যা নির্দিষ্ট করার কোনও উপায় আছে ( আপনার পথে ভিত্তিক আমার পথের শিরোনাম )? আমি ... given 1.FatRat(500), ...সংখ্যাকে 500-সংখ্যার নির্ভুলতা তৈরি করতে 1 ইন এর পাশে ফ্যাটর্যাট (500) যুক্ত করার চেষ্টা করেছি , তবে এটি কার্যকর হয়নি।
লার্স মালমসটিন

@ লারস মেমসটেন আমি FatRatশেষ বিভাগে আপনার খুব গুরুত্বপূর্ণ প্রশ্নটি সম্বোধন করেছি । আমি পুরো উত্তরটিকে সম্মানিত করেছি, যদিও একমাত্র বড় পরিবর্তনটি হ'ল FatRatস্টাফ। (বিটিডব্লু, আমি বুঝতে পেরেছি যে আমার উত্তরটির বেশিরভাগ অংশই আপনার মূল প্রশ্নের পক্ষে সত্যই স্পর্শকাতর; আমার বিশ্বাস আপনি নিজের মনোরঞ্জন করতে এবং পরে পাঠকদের কাছে আকর্ষণীয় হয়ে
উঠতে

অতিরিক্ত প্রচেষ্টা করার জন্য আপনাকে ধন্যবাদ। সুতরাং .FatRatএক্সটেনশনটি অবশ্যই কোড জেনারেটরের ভিতরে রাখতে হবে। এখন আমি এটি FatRatযুক্ত করে এটি চেষ্টা করেছি এবং এটি 1000+ অঙ্কের নির্ভুলতার সাথে গণনা করে । যোগ করা অতিরিক্ত ফ্লাফ চিন্তার মতো is উদাহরণস্বরূপ আমি জানতাম না যে sayদীর্ঘতর অ্যারে / সিকোয়েন্সগুলি ছাঁটাই করছে। এই জাতীয় তথ্যের বিটগুলি জেনে রাখা ভাল।
লার্স মলমস্টিন

@ লারস মেমসটেন :) "সুতরাং .FatRatএক্সটেনশনটি অবশ্যই কোড জেনারেটরের ভিতরে রাখা উচিত"। হ্যাঁ. আরও সাধারণভাবে, যদি বিভাগের সাথে জড়িত কোনও অভিব্যক্তি ইতিমধ্যে মূল্যায়ন করা হয়ে থাকে, তবে ক্ষতিটি পূর্বাবস্থায় নিলে খুব বেশি দেরি হয় যদি এটি যথাযথভাবে প্রবাহিত হয় Rat। যদি এটি থাকে তবে এটি একটি Num(ভাসা) মূল্যায়ণ করবে এবং এর ফলে এটি জড়িত আরও কোনও গণনা কল্পনা করে, এগুলিও তৈরি করে Num। জিনিসগুলি স্থির থাকার একমাত্র উপায় FatRatহ'ল সেগুলি শুরু করাFatRat এবং কোনও উপায় এড়ানো NumIntগুলি ও Ratগুলি ঠিক আছে, তবে FatRatরাকুকে কমপ্লেক্সে থাকতে বলার জন্য কমপক্ষে একটি আছে FatRat
রায়ফ

9

ভগ্নাংশ আছে $_। সুতরাং আপনার প্রয়োজন 1 / (1/$_ * $a++)বা বরং $_ /$a++

রাকু দ্বারা আপনি এই গণনাটি ধাপে ধাপে করতে পারেন

1.FatRat,1,2,3 ... *   #1 1 2 3 4 5 6 7 8 9 ...
andthen .produce: &[*] #1 1 2 6 24 120 720 5040 40320 362880
andthen .map: 1/*      #1 1 1/2 1/6 1/24 1/120 1/720 1/5040 1/40320 1/362880 ...
andthen .produce: &[+] #1 2 2.5 2.666667 2.708333 2.716667 2.718056 2.718254 2.718279 2.718282 ...
andthen .[50].say      #2.71828182845904523536028747135266249775724709369995957496696762772

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