স্বতন্ত্র কনভলিউশন বা বহুপদী গুণাগুণ


19

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

সংজ্ঞা

তালিকাগুলি দেওয়া হয়েছে A=[a(0),a(1),a(2),...,a(n)]এবং B=[b(0),b(1),b(2),...,b(m)](সেটিং a(k)=0 for k<0 and k>nএবং b(k)=0 for k<0 and k>m) তারপরে দু'জনের সমঝোতাটি A*B=[c(0),c(1),...,c(m+n)]কোথায় হিসাবে সংজ্ঞায়িত করা হয়েছেc(k) = sum [ a(x)*b(y) for all integers x y such that x+y=k]

বিধি

  • আপনার ভাষার জন্য কোনও সুবিধাজনক ইনপুট এবং আউটপুট বিন্যাস অনুমোদিত।
  • কনভলিউশনের জন্য বিল্ট-ইনগুলি, কনভলিউশন ম্যাট্রিকগুলি তৈরি করা, পারস্পরিক সম্পর্ক এবং বহুভৌজিক গুণগুলি অনুমোদিত নয়।

উদাহরণ

[1,1]*[1] = [1,1]
[1,1]*[1,1] = [1,2,1]
[1,1]*[1,2,1] = [1,3,3,1]
[1,1]*[1,3,3,1] = [1,4,6,4,1]
[1,1]*[1,4,6,4,1] = [1,5,10,10,5,1]

[1,-1]*[1,1,1,1,1] = [1,0,0,0,0,-1]
[80085,1337]*[-24319,406] = [-1947587115,7,542822]

3
স্পেসিফিকেশনটি বোঝায় যে দৈর্ঘ্য n, m এর ইনপুটগুলি দৈর্ঘ্য n + m - 1 এর আউটপুট তৈরি করতে পারে তবে এটি আপনার পরীক্ষার ক্ষেত্রে বহন করে না [1,1]*[] = []এবং সম্ভবত এটি ধরে রাখতে পারে না []*[] = ?। কনভলিউশন খালি তালিকায় ভালভাবে সংজ্ঞায়িত হয় না। আমি মনে করি আপনার গ্যারান্টি দেওয়া উচিত যে ইনপুট তালিকাগুলি কোনও কিছুই নয়।
অ্যান্ডারস কাসের্গ

1
@ আন্ডারস ক্যাসরগ আপনি ঠিক বলেছেন, আমি এটি পরিবর্তন করব।
flawr

উত্তর:


14

জে, 10 8 বাইট

[:+//.*/

ব্যবহার:

ppc =: [:+//.*/    NB. polynomial product coefficients 
80085 1337 ppc _24319 406
_1947587115 7 542822

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


খুব চালাক পদ্ধতির!
লুইস মেন্ডো

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

অ্যাডওয়্যারের দুর্দান্ত উদাহরণ!
মাইল

6

এমএটিএল , 19 বাইট

PiYdt"TF2&YStpsw]xx

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

এটি প্রথমটির বিপরীতে দুটি ইনপুট দিয়ে একটি ব্লক-ডায়াগোনাল ম্যাট্রিক্স তৈরি করে। উদাহরণস্বরূপ, ইনপুট সহ [1 4 3 5], [1 3 2]ম্যাট্রিক্স হয়

[ 5 3 4 1 0 0 0
  0 0 0 0 1 3 2 ]

প্রথম সারিতে এক অবস্থানকে ডানে সরিয়ে, প্রতিটি কলামের পণ্য গণনা করে এবং সমস্ত ফলাফলের সংমিশ্রনের মাধ্যমে কনভ্যুশনের প্রতিটি এন্ট্রি পাওয়া যায়।

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

উদাহরণস্বরূপ, প্রথম ফলাফল স্থানান্তরিত ম্যাট্রিক্স থেকে প্রাপ্ত হয়

[ 0 5 3 4 1 0 0
  0 0 0 0 1 3 2 ]

এবং এইভাবে হয় 1*1 == 1। দ্বিতীয়টি প্রাপ্ত হয়

[ 0 0 5 3 4 1 0
  0 0 0 0 1 3 2 ]

এবং এভাবে হয় 4*1+1*3 == 7ইত্যাদি etc. এটি অবশ্যই m+n-1বার করতে হবে , কোথায় mএবং nইনপুট দৈর্ঘ্য। কোডটি m+nপুনরাবৃত্তিগুলির সাথে একটি লুপ ব্যবহার করে (যা কিছু বাইট সংরক্ষণ করে) এবং শেষ ফলাফলটি বাতিল করে দেয়।

P          % Take first input (numeric vactor) implicitly and reverse it
i          % Take second input (numeric vactor) 
Yd         % Build diagonal matrix with the two vectors
t          % Duplicate
"          % For each column of the matrix
  TF2&YS   %   Circularly shift first row 1 step to the right
  t        %   Duplicate
  p        %   Product of each column
  s        %   Sum all those products
  w        %   Swap top two elements in stack. The shifted matrix is left on top
]          % End for
xx         % Delete matrix and last result. Implicitly display

4

হাস্কেল, 55 49 বাইট

(a:b)#c=zipWith(+)(0:b#c)$map(a*)c++[]#b
_#c=0<$c

অপারেটর সংজ্ঞা দেয় #


1
আমি মনে করি প্যাডিং [0,0..]হতে পারে (0<$b)ঠিক প্রয়োজনীয় দৈর্ঘ্য দিতে, খালি বেস কেস, যার ফলে _#b=0<$b
xnor

@ এক্সনর প্রকৃতপক্ষে, এটি 6 বাইট সঞ্চয় করে।
অ্যান্ডারস কাসরগ

এখন আমি শেষ পর্যন্ত আপনার উত্তরটি বুঝতে পেরেছি, আমাকে বলতে হবে যে এটি কেবল চতুর চালাক! আমি অভিভূত!
flawr

3

মতলব / অক্টাভ, 41 বাইট

@(p,q)poly([roots(p);roots(q)])*p(1)*q(1)

এটি একটি বেনামী ফাংশন সংজ্ঞায়িত করে। এটিকে কল করতে, এটিকে কোনও চলক বা ব্যবহারের জন্য নির্ধারণ করুন ans

এখানে চেষ্টা করুন

ব্যাখ্যা

এটি এই সত্যগুলিকে কাজে লাগায়

  • (সম্ভবত পুনরাবৃত্তি করা) শিকড়গুলি তার শীর্ষস্থানীয় গুণমান পর্যন্ত বহুভুজকে চিহ্নিত করে।
  • দুটি বহুভুজের পণ্যটির দুটিরই শিকড়।

কোডটি দুটি বহুভুজের (ফাংশন roots) মূলকে গণনা করে একটি কলাম অ্যারেতে যুক্ত করে। এটি থেকে এটি একটি শীর্ষস্থানীয় 1(ফাংশন poly) দিয়ে পণ্যের বহুবর্ষের সহগগুলি অর্জন করে । অবশেষে ফলাফলটি দুটি বহুভুজের নেতৃস্থানীয় সহগ দ্বারা গুণিত হয়।


3

অক্টাভা , 48 বাইট

@(p,q)ifft(fft([p q*0]).*fft([q p*0]))(1:end-1)

এখানে চেষ্টা করুন

ব্যাখ্যা

স্বতন্ত্র কনভ্যুলেশন (পৃথক সময়) ফুরিয়ার রূপান্তরগুলির গুণনের সাথে মিল রয়েছে s সুতরাং বহুবচনগুলিকে গুণিত করার একটি উপায় হ'ল তাদের রূপান্তর করা, রূপান্তরিত ক্রমগুলি গুন করা এবং ফিরে রূপান্তর করা।

যদি ফুরিয়ার ট্রান্সফর্মের পরিবর্তে পৃথক ফুরিয়ার ট্রান্সফর্ম (ডিএফটি) ব্যবহার করা হয়, তবে ফলটি বহুবর্ষীয় সহগের মূল অনুক্রমের বৃত্তাকার সমঝোতা । কোড এই পথ অনুসরণ করে। সার্কুলার কনভোলিউশনটিকে স্ট্যান্ডার্ড কনভোলিউশনের সমান করতে, সিকোয়েন্সগুলি শূন্য-প্যাডযুক্ত হয় এবং ফলাফলটি ছাঁটাই হয়।


ড্যামনিত, আমি এখনও ফাফ্ট নিষিদ্ধ করেছি, তবে ভাল কাজ!
flawr

@ ফ্লোর হ্যাঁ, আমি মনে করি আমরা সে বিষয়ে কথা বললাম ...? :
লুইস মেন্ডো

2

05 এ বি 1 ই , 18 17 বাইট

কোড

0Ev²¹g<Å0«y*NFÁ}+

ব্যাখ্যা

পিছনে তত্ত্ব:

সংবর্তন খুঁজতে, উদাহরণ নিয়ে যাক [1, 2, 3], [3, 4, 5]। আমরা প্রথম অ্যারের মানগুলি উল্টোভাবে এবং উল্লম্বভাবে স্থিতি করি:

3
2
1

এখন, আমরা একটি মইয়ের মতো দ্বিতীয় অ্যারে রাখি এবং এর দ্বারা গুণ করি:

3 ×       [3  4  5]
2 ×    [3  4  5]
1 × [3  4  5]

এতে ফলাফল:

        9   12   15
    6   8   10
3   4   5

তারপরে, আমরা এগুলি যুক্ত করি, এর ফলে:

        9   12   15
    6   8   10
3   4   5       

3   10  22  22   15

সুতরাং, সমঝোতা হয় [3, 10, 22, 22, 15]

কোড নিজেই:

আমরা ব্যবহার ধাপে এই পদক্ষেপ কি করতে যাচ্ছি [1, 2, 3], [3, 4, 5]পরীক্ষা কেস হিসাবে।

0Ev²¹g<Å0«y*NFÁ}+

আমরা প্রথমে পুশ করি 0এবং তারপরে আমরা Eপ্রথম ইনপুট অ্যারের মূল্যায়ন করি । আমরা প্রতিটি উপাদান ব্যবহার করে মানচিত্র v

সুতরাং, প্রতিটি উপাদানগুলির জন্য, আমরা দ্বিতীয় অ্যারের সাথে ²এবং তারপরে প্রথম অ্যারের দৈর্ঘ্যটি চাপি এবং এটি ¹g1 (সহ <) দ্বারা হ্রাস করি । আমরা এটিকে (দৈর্ঘের 1 ম অ্যারে - 1) জিরো দিয়ে জিরো তালিকায় রূপান্তর করি এবং এটিকে আমাদের তালিকায় যুক্ত করি। আমাদের স্ট্যাকটি এখন ইনপুট তালিকার প্রথম আইটেমটির মতো দেখাচ্ছে:Å0

[3, 4, 5, 0, 0]

আমরা বর্তমান আইটেম, সঙ্গে সম্পন্ন সঙ্গে এই অ্যারের গুন y*। এর পরে, আমরা ধাক্কা দিই N, যা বর্তমান আইটেমের সূচকটি নির্দেশ করে (শূন্য-সূচকযুক্ত) এবং অ্যারেটি ঘুরান যা ডানদিকে বহুবার ব্যবহার করে FÁ}। অবশেষে, আমরা এটি আমাদের প্রাথমিক মান ( 0) এ যুক্ত করব। সুতরাং, মূলত যা করা হয় তা নিম্নলিখিত:

[0, 0, 9, 12, 15] +
[0, 6, 8, 10, 0] +
[3, 4, 5, 0, 0] =

[3, 10, 22, 22, 15]

যা পরোক্ষভাবে মুদ্রিত হয়। ব্যবহার সিপি-1252 এনকোডিং। এটি অনলাইন চেষ্টা করুন!


2

জেলি , 9 বাইট

0;+
×'Ṛç/

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

×'Ṛç/  Main link. Arguments: p, q (lists)

×'     Spawned multiplication; multiply each item of p with each item of q.
  Ṛ    Reverse the rows of the result.
   ç/  Reduce the rows by the helper link.


0;+    Helper link. Arguments: p, q (lists)

0;     Prepend a 0 to p.
  +    Perform vectorized addition of the result and q.

J‽ এর চেয়ে জেলি আর কী আর সংজ্ঞা দিয়ে অসম্ভব!
অ্যাডম

2

কাস্তে , 5 বাইট

mΣ∂Ṫ*

এটি অনলাইন চেষ্টা করুন!

দ্রষ্টব্য: শূন্য-বহুপদী / খালি তালিকা সরবরাহ করার সময়, আপনাকে এর ধরণ (যেমন। []:LN) নির্দিষ্ট করতে হবে !

ব্যাখ্যা

mΣ∂Ṫ*  -- implicit inputs xs ys, for example: [1,-1] [1,1]
   Ṫ*  -- compute the outer product xsᵀ·ys: [[1,1],[-1,-1]]
  ∂    -- diagonals: [[1],[1,-1],[-1]]
mΣ     -- map sum: [1,0,1]

2

মতলব, 33 বাইট

@(x,y)sum(spdiags(flip(x').*y),1)

এটি অনলাইন চেষ্টা করুন!

ইনপুটগুলির সমস্ত উপাদান-ভিত্তিক পণ্যগুলির একটি ম্যাট্রিক্স তৈরি করে, তার পরে ত্রিভুজগুলির যোগফল। ,1শেষ বাহিনী সঠিক দিক বরাবর যোগফল যখন ইনপুট ভেক্টর এক দৈর্ঘ্য 1 গেছে মতলব।

অক্টেভ সালে spdiagsভেক্টরের জন্য কাজ করে না, একটি ত্রুটি ফলে ইনপুটগুলি এক দৈর্ঘ্য 1. মতলব 2016b আছে বা নতুন উপাদান ভিত্তিক পণ্যের স্পষ্ট সম্প্রসারণ প্রয়োজন।


চমৎকার পন্থা !!
লুইস মেন্ডো


1

পাইথন, 90 বাইট

lambda p,q:[sum((p+k*[0])[i]*(q+k*[0])[k-i]for i in range(k+1))for k in range(len(p+q)-1)]

1

জাভাস্ক্রিপ্ট (ES6), 64 বাইট

(a,b)=>a.map((n,i)=>b.map((m,j)=>r[j+=i]=m*n+(r[j]||0)),r=[])&&r

যদি কোনও ইনপুট খালি থাকে তবে খালি অ্যারেটি ফেরত দেয়। আমার উত্তর ভিত্তিক Polynomialception



1

ক্লোজার, 104 বাইট

#(vals(apply merge-with +(sorted-map)(for[i(range(count %))j(range(count %2))]{(+ i j)(*(% i)(%2 j))})))

sorted-mapগ্যারান্টিতে মার্জ করা হচ্ছে যে মানগুলি সঠিক ক্রমে ফিরে আসে। আমি আশা করি আরও কয়েকটি পরীক্ষার মামলা থাকত।

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