ফ্যাক্টরিয়ালগুলি


12

এই গল্ফের জন্য একাধিক থ্রেড বা প্রক্রিয়াগুলির মধ্যে ভাগের একটি কল্পিত হিসাব প্রয়োজন।

কিছু ভাষাগুলি অন্যদের তুলনায় এটিকে সমন্বয় করা সহজ করে তোলে, তাই এটি ল্যাং অজোনস্টিক। অসম্পূর্ণ উদাহরণ কোড সরবরাহ করা হয়েছে তবে আপনার নিজের অ্যালগরিদম বিকাশ করা উচিত।

প্রতিযোগিতার লক্ষ্যটি হ'ল এন কে গণনার জন্য কে সবচেয়ে সংক্ষিপ্ত (বাইটে, সেকেন্ড নয়) মাল্টিকোর ফ্যাক্টরিয়াল অ্যালগরিদম নিয়ে আসতে পারে তা দেখতে হবে! ভোট হিসাবে পরিমাপ হিসাবে প্রতিযোগিতা বন্ধ যখন। মাল্টিকোরের সুবিধা থাকতে হবে, সুতরাং আমাদের এটি প্রয়োজন হবে যে এটি এন N 10,000 এর জন্য কাজ করা উচিত। লেখক কীভাবে এটি প্রসেসর / কোরগুলির মধ্যে কাজটি ছড়িয়ে দেয় এবং গল্ফের দৃis়তার ভিত্তিতে ভোট দেয় তার একটি বৈধ ব্যাখ্যা দিতে ব্যর্থ হলে ভোটারদের ভোট দেওয়া উচিত।

কৌতূহলের জন্য, দয়া করে কিছু পারফরম্যান্স নম্বর পোস্ট করুন। কোনও সময়ে বনাম গল্ফ স্কোর ট্রেড অফ হতে পারে, গল্ফের সাথে প্রয়োজনীয়তা পূরণের সাথে এতক্ষণ যেতে হবে go আমি কখন জানতে আগ্রহী হতে চাই।

আপনি সাধারণত উপলব্ধ সিঙ্গল কোর বড় পূর্ণসংখ্যার লাইব্রেরি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, পার্ল সাধারণত বিগিন্টের সাথে ইনস্টল করা থাকে। তবে নোট করুন যে কেবল কোনও সিস্টেম সরবরাহিত ফ্যাক্টরিয়াল ফাংশনকে কল করা সাধারণত কাজটিকে একাধিক কোর জুড়ে বিভক্ত করে না।

আপনাকে অবশ্যই STDIN বা ARGV থেকে ইনপুট N এবং আউটপুট এন এর মানটি মানতে হবে !. আপনি প্রোগ্রামটিতে প্রসেসরের সংখ্যা / কোরগুলির সংখ্যা সরবরাহ করতে optionচ্ছিকভাবে একটি ২ য় ইনপুট প্যারামিটার ব্যবহার করতে পারেন যাতে এটি নীচে যা দেখায় তা করে না :-) অথবা আপনি যা কিছু পেয়েছেন তা 2: 4 এর জন্য আপনি স্পষ্টভাবে ডিজাইন করতে পারেন।

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

আমার উদাহরণে পারফরম্যান্স বেশ কয়েকটি কারণে অপ্রয়োজনীয়: এটি অনেকগুলি প্রক্রিয়া, অত্যধিক স্ট্রিং / বিগিন্ট রূপান্তর ব্যবহার করে। যেমনটি আমি বলেছিলাম এটি ইচ্ছাকৃতভাবে ওডবলের উদাহরণ। এটি হিসাব করবে 5000! এখানে একটি 4 কোর মেশিনে 10 সেকেন্ডের মধ্যে। তবে / পরবর্তী লুপের জন্য আরও সুস্পষ্ট দুটি লাইনার 5000 করতে পারে! 3.6 এর মধ্যে চারটি প্রসেসরের একটিতে।

আপনাকে অবশ্যই এর থেকে আরও ভাল করতে হবে:

#!/usr/bin/perl -w                                                              
use strict;
use bigint;
die "usage: f.perl N (outputs N!)" unless ($ARGV[0] > 1);
print STDOUT &main::rangeProduct(1,$ARGV[0])."\n";
sub main::rangeProduct {
    my($l, $h) = @_;
    return $l    if ($l==$h);
    return $l*$h if ($l==($h-1));
    # arghhh - multiplying more than 2 numbers at a time is too much work       
    # find the midpoint and split the work up :-)                               
    my $m = int(($h+$l)/2);
    my $pid = open(my $KID, "-|");
      if ($pid){ # parent                                                       
        my $X = &main::rangeProduct($l,$m);
        my $Y = <$KID>;
        chomp($Y);
        close($KID);
        die "kid failed" unless defined $Y;
        return $X*$Y;
      } else {
        # kid                                                                   
        print STDOUT &main::rangeProduct($m+1,$h)."\n";
        exit(0);
    }
}

এ সম্পর্কে আমার আগ্রহটি সহজভাবে (1) একঘেয়েমি দূর করতে; এবং (২) নতুন কিছু শিখতে হবে। এটি আমার জন্য হোমওয়ার্ক বা গবেষণার সমস্যা নয়।

শুভকামনা!


10
আপনি ভোটের মাধ্যমে সংক্ষিপ্ততম কোডটি গণনা করতে পারবেন না এবং গল্ফিং এবং মাল্টি-থ্রেডের প্রয়োজনীয়তাগুলি একসাথে খারাপভাবে চলবে বলে মনে হচ্ছে।
aaaaaaaaaaaa

আমার প্রাচীন একক কোর নোটবুক 10000 করতে পারে! পাইথনে 0.2 সেকেন্ডেরও কম।
gnibbler

সিপিইউ-বাউন্ড প্রক্রিয়াটি মাল্টি-থ্রেডিং প্রায় সর্বদা এটি ধীর করে দেবে। আপনি যা করছেন সবই সামান্য বা কোনও কার্যকারিতা লাভের সাথে ওভারহেড যুক্ত করছে। মাল্টি-থ্রেডিং আই / ও-ওয়েটের জন্য।
মেল্লামব্যাক

2
@ মেল্লামোকব: মাল্টি-কোর সিস্টেমগুলির জন্য আমি আলাদা হতে অনুরোধ করছি।
জোয়ি

@ জোয়ি: আহ। ছোট্ট এই
অনুচ্ছেদে

উত্তর:


7

ম্যাথামেটিকাল

একটি সমান্তরাল-সক্ষম ফাংশন:

 f[n_, g_] := g[Product[N@i, {i, 1, n, 2}] Product[N@i, {i, 2, n, 2}]]

জি যেখানে Identityবা Parallelizeপ্রয়োজনীয় প্রসেসের ধরণের উপর নির্ভর করে

সময় পরীক্ষার জন্য, আমরা ফাংশনটি সামান্য পরিবর্তন করব, যাতে এটি আসল ঘড়ির সময় দেয় returns

f[n_, g_] := First@AbsoluteTiming[g[Product[N@i,{i,1,n,2}] Product[N@i,{i,2,n,2}]]]

এবং আমরা উভয় মোড পরীক্ষা করি (10 ^ 5 থেকে 9 * 10 ^ 5 পর্যন্ত): (এখানে কেবলমাত্র দুটি কর্নেল)

ListLinePlot[{Table[f[i, Identity],    {i, 100000, 900000, 100000}], 
              Table[f[i, Parallelize], {i, 100000, 900000, 100000}]}]   

ফলাফল: এখানে চিত্র বর্ণনা লিখুন


আপনি কি প্রথম কোড লাইনে একটি] মিস করছেন? এটি ভারসাম্যহীন দেখায়।
পিটার টেলর

@ পিটার ধন্যবাদ, সর্বশেষ "]" অনুলিপিটি বাছাই করে না। সংশোধন।
ডাঃ বেলিসারিয়াস

1
এটি সংক্ষিপ্ততম বলে মনে হয়। এটিকে দেখতে দ্রুততমের মতো দেখায়, যদি না আমি কিছু ভুল করে পড়ে থাকি। আমি আর ম্যাথমেটিকার সাবস্ক্রাইব করি না তাই যাচাই করতে পারি না। অংশগ্রহণের জন্য ধন্যবাদ।
পল

7

হাস্কেল: 209 200 198 177 অক্ষর

176 167 উত্স + 33 10 সংকলক পতাকা

এই সমাধানটি বেশ নির্বোধ। এটি প্রকারের মানের সমান্তরালে পণ্য প্রয়োগ করে [[Integer]], যেখানে অভ্যন্তরীণ তালিকা সর্বাধিক দুটি আইটেম দীর্ঘ long একবার বাইরের তালিকাটি সর্বাধিক 2 টি তালিকার নীচে নেমে গেলে, আমরা এটিকে সমতল করি এবং সরাসরি পণ্যটি নিয়ে যাই। এবং হ্যাঁ, টাইপ চেকারের জন্য পূর্ণসংখ্যার সাথে কিছু মন্তব্য করা প্রয়োজন, অন্যথায় এটি সংকলন করবে না।

import Control.Parallel.Strategies
s(x:y:z)=[[x,y::Integer]]++s z;s x=[x]
p=product
f n=p$concat$(until((<3).length)$s.parMap rseq p)$s[1..n]
main=interact$show.f.read

(মাঝখানে অংশ পড়া নির্দ্বিধায় fমধ্যে concatএবং sহিসাবে "যতক্ষণ না আমি হৃদয় দৈর্ঘ্য")

কন্ট্রোল.প্যারালাল.স্ট্রেজিগুলি থেকে পারম্যাপটি যেহেতু এগুলি বেশ ভাল হতে চলেছে এমন জিনিসগুলি দেখে মনে হচ্ছে এটি একাধিক থ্রেডে এটিকে খামার করা বেশ সহজ করে তোলে। তবে, দেখে মনে হচ্ছে জিএইচসি 7-র একাধিক কোর (যা আমি মোটটিতে অন্তর্ভুক্ত করেছি) থ্রেডেড রানটাইম সক্ষম করার জন্য কমান্ড লাইন বিকল্পগুলি এবং পরিবেশের ভারগুলিতে পুরোপুরি 33 টি অক্ষর প্রয়োজন। আমি যদি কিছু মিস না করি তবে অবশ্যই এটি সম্ভব । ( আপডেট : থ্রেডেড জিএইচসি রানটাইমটি এন -1 থ্রেড ব্যবহার করার জন্য উপস্থিত হয়, যেখানে এন কোরগুলির সংখ্যা, তাই রান টাইম বিকল্পগুলির সাথে ঝাঁকুনির প্রয়োজন নেই))

সংকলন করতে:

ghc -threaded prog.hs

সমান্তরাল মূল্যায়নের হাস্যকর সংখ্যার স্পার্কিং হওয়া এবং আমি -O2 দিয়ে সংকলন করি নি বলে রানটাইমটি বেশ ভাল ছিল। 50000 এর জন্য! দ্বৈত-কোর ম্যাকবুক-এ, আমি পেয়েছি:

SPARKS: 50020 (29020 converted, 1925 pruned)

INIT  time    0.00s  (  0.00s elapsed)
MUT   time    0.20s  (  0.19s elapsed)
GC    time    0.12s  (  0.07s elapsed)
EXIT  time    0.00s  (  0.00s elapsed)
Total time    0.31s  (  0.27s elapsed)

কয়েকটি ভিন্ন মানের জন্য মোট সময়, প্রথম কলামটি হ'ল গল্ফড সমান্তরাল, দ্বিতীয়টি নিষ্পাপ অনুক্রমিক সংস্করণ:

          Parallel   Sequential
 10000!      0.03s        0.04s
 50000!      0.27s        0.78s
100000!      0.74s        3.08s
500000!      7.04s       86.51s

রেফারেন্সের জন্য, নিষ্পাপ ক্রমিক সংস্করণ হ'ল এটি (যা -O2 দিয়ে সংকলিত হয়েছিল):

factorial :: Integer -> Integer
factorial n = product [1..n]
main = interact $ show.factorial.read

1
আইএমও, আপনাকে সংকলক এবং দোভাষীর জন্য আরোগুলি গণনা করতে হবে না।
FUZxxl

@ ফুজজেক্সএল: সাধারণত আমি সম্মত হই, তবে এই সমস্যাটি বিশেষভাবে অনুরোধ করেছিল যে এটি একাধিক থ্রেড বা প্রক্রিয়াগুলিতে চালিত হয় এবং এই পতাকাগুলি ঘটতে হবে (কমপক্ষে সর্বশেষতম হাস্কেল প্ল্যাটফর্ম থেকে জিএইচসি 7.0.2 দিয়ে)।

6

রুবি - 111 + 56 = 167 টি অক্ষর

এটি একটি দুটি ফাইল স্ক্রিপ্ট, মূল ফাইল ( fact.rb):

c,n=*$*.map(&:to_i)
p=(0...c).map{|k|IO.popen("ruby f2.rb #{k} #{c} #{n}")}
p p.map{|l|l.read.to_i}.inject(:*)

অতিরিক্ত ফাইল ( f2.rb):

c,h,n=*$*.map(&:to_i)
p (c*n/h+1..(c+1)*n/h).inject(:*)

আরগস হিসাবে গণনা করতে প্রসেসের সংখ্যা এবং সংখ্যাটি কেবল গ্রহণ করে এবং প্রতিটি প্রক্রিয়া পৃথকভাবে গণনা করতে পারে এমন কাজগুলিকে পরিসীমাতে বিভক্ত করে। তারপরে ফলাফলগুলি বহুগুণ করে।

এটি সত্যিই দেখায় যে রুবিনিয়াস ইয়ার্ভের তুলনায় কতটা ধীর:

Rubinius:

time ruby fact.rb 5 5000 #=> 61.84s

Ruby1.9.2:

time ruby fact.rb 5 50000 #=> 3.09s

(অতিরিক্ত নোট করুন 0)


1
ইনজেক্টটি আর্গুমেন্ট হিসাবে একটি প্রতীক নিতে পারে, তাই আপনি ব্যবহার করে একটি অক্ষর সংরক্ষণ করতে পারেন inject(:+)। এখানে ডক্স থেকে উদাহরণ আছে: (5..10).reduce(:+)
মাইকেল কোহল

@ মিশেল: ধন্যবাদ :) এছাড়াও কেবল খেয়াল করেছিলাম যে আমার এমন একটি ছিল 8যেখানে *যদি কেউ এই চলমান সমস্যা হয় তবে একটি হওয়া উচিত ছিল।
নিমো 157

6

জাভা, 523 519 434 430 429 অক্ষর

import java.math.*;public class G extends Thread{BigInteger o,i,r=BigInteger.ONE,h;G g;G(BigInteger O,int
I,int n){o=O;i=new BigInteger(""+I);if(n>1)g=new G(O.subtract(r),I,n-1);h=n==I?i:r;start();}public void
run(){while(o.signum()>0){r=r.multiply(o);o=o.subtract(i);}try{g.join();r=r.multiply(g.r);}catch(Exception
e){}if(h==i)System.out.println(r);}public static void main(String[] args){new G(new BigInteger(args[0]),4,4);}}

চূড়ান্ত লাইনে দুটি 4s হ'ল থ্রেড ব্যবহার করার সংখ্যা।

50000! নিম্নলিখিত কাঠামোর সাথে পরীক্ষা করা হয়েছে (মূল সংস্করণটির অরক্ষিত সংস্করণ এবং মুষ্টিমেয় কয়েকটি খারাপ অভ্যাসের সাথে - যদিও এটি এখনও প্রচুর পরিমাণে পেয়েছে) দেয় (আমার 4-কোর লিনাক্স মেশিনে) সময়

7685ms
2338ms
1361ms
1093ms
7724ms

নোট করুন যে আমি ন্যায়বিচারের জন্য এক থ্রেড দিয়ে পরীক্ষার পুনরাবৃত্তি করেছি কারণ জিটটি উত্তপ্ত হতে পারে।

import java.math.*;

public class ForkingFactorials extends Thread { // Bad practice!
    private BigInteger off, inc;
    private volatile BigInteger res;

    private ForkingFactorials(int off, int inc) {
        this.off = new BigInteger(Integer.toString(off));
        this.inc = new BigInteger(Integer.toString(inc));
    }

    public void run() {
        BigInteger p = new BigInteger("1");
        while (off.signum() > 0) {
            p = p.multiply(off);
            off = off.subtract(inc);
        }
        res = p;
    }

    public static void main(String[] args) throws Exception {
        int n = Integer.parseInt(args[0]);
        System.out.println(f(n, 1));
        System.out.println(f(n, 2));
        System.out.println(f(n, 3));
        System.out.println(f(n, 4));
        System.out.println(f(n, 1));
    }

    private static BigInteger f(int n, int numThreads) throws Exception {
        long now = System.currentTimeMillis();
        ForkingFactorials[] th = new ForkingFactorials[numThreads];
        for (int i = 0; i < n && i < numThreads; i++) {
            th[i] = new ForkingFactorials(n-i, numThreads);
            th[i].start();
        }
        BigInteger f = new BigInteger("1");
        for (int i = 0; i < n && i < numThreads; i++) {
            th[i].join();
            f = f.multiply(th[i].res);
        }
        long t = System.currentTimeMillis() - now;
        System.err.println("Took " + t + "ms");
        return f;
    }
}

বিগিন্ট সহ জাভা গল্ফিংয়ের জন্য সঠিক ভাষা নয় (কেবলমাত্র খারাপ জিনিসগুলি তৈরি করতে আমাকে কী করতে হবে তা দেখুন, কারণ যে কনস্ট্রাক্টর দীর্ঘ সময় নেয় এটি ব্যক্তিগত) তবে ওহে।

এটি অসম্পূর্ণ কোড থেকে পুরোপুরি স্পষ্ট হওয়া উচিত যে এটি কীভাবে কাজটি ব্রেক করবে: প্রতিটি থ্রেড একটি সমতুল্য শ্রেণীর মডুলুকে থ্রেডের সংখ্যাকে গুণ করে। মূল বিষয় হ'ল প্রতিটি থ্রেড প্রায় একই পরিমাণ কাজ করে।


5

সিএসআরপ - 206 215 অক্ষর

using System;using System.Numerics;using System.Threading.Tasks;class a{static void Main(){var n=int.Parse(Console.ReadLine());var r=new BigInteger(1);Parallel.For(1,n+1,i=>{lock(this)r*=i;});Console.WriteLine(r);}}

সি # সমান্তরাল.ফোর () কার্যকারিতা সহ গণনাটি বিভক্ত করে।

সম্পাদনা করুন; লক ভুলে গেছি

ফাঁসির সময়:

n = 10,000, time: 59ms.
n = 20,000, time: 50ms.
n = 30,000, time: 38ms.
n = 40,000, time: 100ms.
n = 50,000, time: 139ms.
n = 60,000, time: 164ms.
n = 70,000, time: 222ms.
n = 80,000, time: 266ms.
n = 90,000, time: 401ms.
n = 100,000, time: 424ms.
n = 110,000, time: 501ms.
n = 120,000, time: 583ms.
n = 130,000, time: 659ms.
n = 140,000, time: 832ms.
n = 150,000, time: 1143ms.
n = 160,000, time: 804ms.
n = 170,000, time: 653ms.
n = 180,000, time: 1031ms.
n = 190,000, time: 1034ms.
n = 200,000, time: 1765ms.
n = 210,000, time: 1059ms.
n = 220,000, time: 1214ms.
n = 230,000, time: 1362ms.
n = 240,000, time: 2737ms.
n = 250,000, time: 1761ms.
n = 260,000, time: 1823ms.
n = 270,000, time: 3357ms.
n = 280,000, time: 2110ms.

4

পার্ল, 140

Nস্ট্যান্ডার্ড ইনপুট থেকে নেয় ।

use bigint;$m=<>;open A,'>',
undef;$i=$p=fork&&1;$n=++$i;
{$i+=2;$n*=$i,redo if$i<=$m}
if($p){wait;seek A,0,0;$_=<A
>;print$n*$_}else{print A$n}

বৈশিষ্ট্য:

  • গণনা বিভাজন: একপাশে সন্ধ্যা এবং অন্যদিকে বৈষম্য (এর চেয়ে জটিল আরও কিছু কিছুর জন্য উপযুক্ততার ভারসাম্য ভারসাম্য বজায় রাখতে অনেকগুলি অক্ষরের প্রয়োজন হবে।
  • আইপিসি একটি ভাগ করা অনামী ফাইল ব্যবহার করে।

মাপকাঠি:

  • 10000! ২.৩ এস কাঁটাযুক্ত, ৩.৪ এস অবমুক্ত printed
  • 100000! 5'08.8 টি কাঁটাযুক্ত, 7'07.9 অনাবৃত মুদ্রিত হয়

4

স্কালা ( 345 266 244 232 214 টি অক্ষর)

অভিনেতা ব্যবহার:

object F extends App{import actors.Actor._;var(t,c,r)=(args(1).toInt,self,1:BigInt);val n=args(0).toInt min t;for(i<-0 to n-1)actor{c!(i*t/n+1 to(i+1)*t/n).product};for(i<-1 to n)receive{case m:Int=>r*=m};print(r)}

সম্পাদনা - মুছে উল্লেখ System.currentTimeMillis()আউট উপাদান a(1).toInt, থেকে পরিবর্তিত List.rangeকরাx to y

সম্পাদনা 2 - whileলুপটি forএকটিতে পরিবর্তিত হয়েছে, বাম ভাঁজটিকে একই কাজ করে এমন একটি তালিকার ফাংশনে পরিবর্তন করেছেন, অন্তর্নিহিত ধরণের রূপান্তরগুলির উপর নির্ভর করে যাতে 6 BigIntচরটি একবারই প্রদর্শিত হয়, মুদ্রণটির জন্য প্রিন্টলন পরিবর্তিত হয়

3 সম্পাদনা করুন - স্কালায় একাধিক ঘোষণা কীভাবে করবেন তা খুঁজে পেয়েছেন

4 সম্পাদনা করুন - আমি যখন প্রথম প্রথম এটি করেছি তখন থেকে আমি বিভিন্ন অপ্টিমাইজেশন শিখেছি

অবরুদ্ধ সংস্করণ:

import actors.Actor._
object ForkingFactorials extends App
{
    var (target,caller,result)=(args(1).toInt,self,1:BigInt)
    val numthreads=args(0).toInt min target
    for(i<-0 to numthreads-1)
        actor
        {
            caller ! (i*target/numthreads+1 to(i+1)*target/numthreads+1).product
        }
    for(i<-1 to numthreads)
        receive
        {
            case m:Int=>result*=m
        }
    print(result)
}

3

স্কালা-2.9.0 170

object P extends App{
def d(n:Int,c:Int)=(for(i<-1 to c)yield(i to n by c)).par
println((BigInt(1)/: d(args(0).toInt,args(1).toInt).map(x=>(BigInt(1)/: x)(_*_)))(_*_))}

ungolfed:

object ParallelFactorials extends App
{
  def distribute (n: Int, cores: Int) = {
    val factorgroup = for (i <- 1 to cores) 
      yield (i to n by cores)
    factorgroup.par
  }

  val parallellist = distribute (args(0).toInt, args(1).toInt)

  println ((BigInt (1) /: parallellist.map (x => (BigInt(1) /: x) (_ * _)))(_ * _))

}

10 এর ফ্যাক্টরিয়াল 4 টি তালিকা তৈরি করে 4 টি কোরে গণনা করা হয়:

  • 1 5 9
  • 2 6 10
  • 3 7
  • 4 8

যা সমান্তরালভাবে গুণিত হয়। সংখ্যাগুলি বিতরণ করার জন্য একটি সহজ পদ্ধতি থাকতে পারে:

 (1 to n).sliding ((n/cores), (n/cores) 
  • 1 2 3
  • 4 5 6
  • 7 8 9
  • 10

তবে বিতরণটি তেমন ভাল হবে না - ছোট সংখ্যাগুলি সমস্ত একই তালিকার সমাপ্ত হবে, অন্য একটিতে সর্বাধিক, শেষ তালিকার দীর্ঘতর গণনার দিকে পরিচালিত করবে (উচ্চ এনএস-এর জন্য, শেষ থ্রেডটি প্রায় খালি হবে না , তবে কমপক্ষে অন্তর্ভুক্ত (এন / কোর)-কোর্সের উপাদান রয়েছে।

সংস্করণ ২.৯-এর স্কেলে সমান্তরাল সংগ্রহ রয়েছে, যা সমান্তরাল প্রার্থনা নিজেরাই পরিচালনা করে।


2

এরং - 295 টি অক্ষর।

প্রথম জিনিসটি আমি এর্লংয়ে কখনও লিখেছিলাম তাই কেউ যদি সহজেই এটি অর্ধেক করতে পারে তবে আমি অবাক হব না:

-module(f).
-export([m/2,f/4]).
m(N,C)->g(N,C,C,[]).
r([],B)->B;
r(A,B)->receive{F,V}->r(lists:delete(F,A),V*B)end.
s(H,L)->spawn(f,f,[self(),H,L,1]).
g(N,1,H,A)->r([s(N div H,1)|A],1);
g(N,C,H,A)->g(N,C-1,H,[s(N*C div H,N*(C-1) div H)|A]).
f(P,H,H,A)->P!{self(),A};
f(P,H,L,A)->f(P,H-1,L,A*H).

আমার আগের রুবি এন্ট্রির মতো একই থ্রেডিং মডেলটি ব্যবহার করে: উপ-পরিসীমাতে পরিসীমা বিভক্ত করে এবং পৃথক থ্রেডগুলিতে রেঞ্জগুলি একসাথে গুন করে তারপরে ফলাফলগুলি মূল থ্রেডে গুণিত করে।

আমি কীভাবে এসক্রিপ্টটি কাজ করব তা ঠিক তেমন সংরক্ষণ করুন f.erlএবং এরল খুলুন এবং চালনা করুন:

c(f).
f:m(NUM_TO_CALC, NUM_OF_PROCESSES).

উপযুক্ত বিকল্প সহ।

আমার ম্যাকবুক এয়ারে (দ্বৈত-কোর) 2 প্রসেসে 50000 এর জন্য 8 টি এবং 1 প্রক্রিয়ার জন্য 10 সেকেন্ড পেয়েছিলেন।

দ্রষ্টব্য: কেবলমাত্র লক্ষ্য করা গেছে যে আপনি সংখ্যার চেয়ে বেশি প্রক্রিয়া ফ্যাক্টরিয়ালাইজ করার চেষ্টা করলে এটি হিমশীতল হয়ে পড়ে।

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