ক্রোনেকার প্রতীক গণনা করুন


9

প্রাসঙ্গিক লিঙ্কগুলি এখানে এবং এখানে , তবে এখানে সংক্ষিপ্ত সংস্করণটি রয়েছে:

আপনার কাছে দুটি পূর্ণসংখ্যার ইনপুট রয়েছে aএবং bনেতিবাচক অনন্ত এবং অনন্তের মধ্যে (যদিও প্রয়োজনে আমি ব্যাপ্তিটি সীমাবদ্ধ করতে পারি তবে ফাংশনটি এখনও অবশ্যই নেতিবাচক ইনপুট গ্রহণ করতে পারে)।

ক্রোনেকার প্রতীক সংজ্ঞা

(a|b)ইনপুট aএবং bকোথায় আপনাকে ক্রোনেকার প্রতীকটি ফিরে আসতে হবে

(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n

যেখানে b = p_1^e_1 * p_2^e_2 * ... * p_n^e_nএবং p_iএবং e_iএর প্রধান ফ্যাক্টরীকরণের মধ্যে প্রাইমস এবং এক্সপোজারগুলি b

একটি বিজোড় প্রাইম জন্য p, এখানে(a|p)=a^((p-1)/2) (mod p) সংজ্ঞায়িত ।

জন্য b == 2,(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)

জন্য b == -1,(n|-1)={-1 for n<0; 1 for n>0

যদি a >= b, (a|b) == (z|b)কোথায় z == a % b। এই সম্পত্তি দ্বারা, এবং হিসাবে ব্যাখ্যা এখানে এবং এখানে , aএকটি দ্বিঘাত অবশিষ্টাংশ হয় bযদি zহয়, যদিও a >= b

(-1|b)= 1যদি b == 0,1,2 (mod 4)এবং -1যদি b == 3 (mod 4)(0|b)হয় 0ছাড়া (0|1)যা 1, কারণ (a|1)সর্বদা 1এবং ঋণাত্মক জন্য a, (-a|b) == (-1|b) * (a|b)

ক্রোনেকার প্রতীকের আউটপুট সর্বদা থাকে -1, 0 or 1, যেখানে আউটপুট 0থাকে aএবং bযদি কোনও সাধারণ কারণ থাকে। তাহলে b, একটি বিজোড় মৌলিক (a|b) == 1যদি aএকটি হয় দ্বিঘাত অবশিষ্টাংশ গেলিক ভাষার b, আর -1যদি এটি একটি দ্বিঘাত অবশিষ্টাংশ নয়।

বিধি

  • আপনার কোড অবশ্যই একটি প্রোগ্রাম বা একটি ফাংশন হতে হবে।

  • ইনপুটগুলি অবশ্যই ক্রমে থাকা উচিত a b

  • আউটপুট অবশ্যই হয় -1, 0বা 1

  • এটি কোড গল্ফ, সুতরাং আপনার কোডটি দক্ষ হতে হবে না, কেবল সংক্ষেপে।

  • এমন কোনও বিল্ট-ইন নেই যা ক্রোনেকার বা সম্পর্কিত জ্যাকোবি এবং লেজেন্ড্রে প্রতীকগুলি সরাসরি গণনা করে। অন্যান্য বিল্ট-ইনগুলি (উদাহরণস্বরূপ প্রাইম ফ্যাক্টরীকরণের জন্য) নিখরচায় খেলা।

উদাহরণ

>>> kronecker(1, 5)
1
>>> kronecker(3, 8)
-1
>>> kronecker(15, 22)
1
>>> kronecker(21, 7)
0
>>> kronecker(5, 31)
1
>>> kronecker(31, 5)
1
>>> kronecker(7, 19)
1
>>> kronecker(19, 7)
-1
>>> kronecker(323, 455625)
1
>>> kronecker(0, 12)
0
>>> kronecker(0, 1)
1
>>> kronecker(12, 0)
0
>>> kronecker(1, 0)
1
>>> kronecker(-1, 5)
1
>>> kronecker(1, -5)
1
>>> kronecker(-1, -5)
-1
>>> kronecker(6, 7)
-1
>>> kronecker(-1, -7)
1
>>> kronecker(-6, -7)
-1

এটি একটি জটিল ফাংশন, সুতরাং দয়া করে কিছু অস্পষ্ট কিনা তা আমাকে জানান।


আপনি কি নিশ্চিত যে আপনি বিল্ট-ইনগুলি বাতিল করতে চান না? রেফারেন্স.ওল্ফ্রাম.
com/আলংয়েজ /

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

আমি কেন পুরোপুরি নিশ্চিত নই (31 | 5) 1 কেন দেয় 1. সেখানে একটি চতুর্ভুজীয় অবশিষ্টাংশ থাকা উচিত না কেন এটি -1 হয় না?
ইউমেল

এছাড়াও 7/19 হওয়া উচিত 1 এবং 19/7 আপনার লিঙ্কিত উইকি অনুযায়ী -1 হওয়া উচিত
Eumel

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

উত্তর:


2

সিজেএম (70 বাইট)

{_g\zmf+f{:P2+"W>2*(
z1=
;1
7&4-z[0W0X0]=
P%P+P(2/#P%_1>P*-"N/<W=~}:*}

অনলাইন ডেমো (ম্যাথমেটিকা ​​দিয়ে তৈরি পরীক্ষার কেস)।

ব্যবচ্ছেদ

{               e# Anonymous function. Stack: a b
  _g\zmf+       e# Factorise b, with special treatment for negatives
                e# CJam also gives special treatment to 0 and 1
                e# Stack: e.g. a [-1 2 2 5]; or a [-1 1]; or a [0 0]; or a [1 2 2 5]
  f{            e# For each "prime" factor P, find (a|P)
    :P2+        e# Extract code for P from an array formed by splitting a string
    "W>2*(      e#   a -> (a|-1)
z1=             e#   a -> (a|0)
;1              e#   a -> (a|1)
7&4-z[0W0X0]=   e#   a -> (a|2)
P%P+P(2/#P%_1>P*-" e# a -> (a|P) for odd prime P
    N/<W=~      e# Split string and select appropriate element
  }
  :*            e# Multiply the components together
}

আমি (a|2)একই চরিত্রের গণনার জন্য মূল্যায়নের বেশ কয়েকটি উপায় খুঁজে পেয়েছি এবং পরিষ্কার উপস্থাপনাটির সাথে এটি ব্যবহার করা বেছে নিয়েছি ।

integer array <W= আইএমও হ'ল ফ্যালব্যাকগুলি করার বেশ মার্জিত উপায়: যদি পূর্ণসংখ্য অ্যারের দৈর্ঘ্যের চেয়ে বড় হয় তবে আমরা শেষ উপাদানটি নির্বাচন করি।

অন্যান্য বক্তব্য

বিজোড় প্রধানের জন্য এটি হতাশাব্যঞ্জক p জন্য সরাসরি ফর্ম্যাট-স্টাইলটি (a|p)খুব সংক্ষিপ্ত, কারণ আমি (a|n)ইতিবাচক অদ্ভুততার জন্য এটির সন্ধানের একটি খুব আরামদায়ক উপায় nযা আমি ব্যবহার করতে চেয়েছিলাম। ভিত্তি হ'ল জোলোত্রেভের লেমা:

যদি p কোনও বিজোড় প্রাইম হয় এবং aএটি পূর্ণসংখ্যার কপিরাইট হয় pতবে লেজেন্ড্রে প্রতীক (a|p)হ'ল ক্রমান্বয়ের চিহ্নx -> ax (mod p)

এটি ফ্রোবিনিয়াস টু দ্বারা জোরদার করেছিলেন

যদি a এবং bকপিরাইম পজিটিভ বিজোড় পূর্ণসংখ্যার হয় তবে জ্যাকোবি প্রতীক (a|b)হ'ল আদেশের চিহ্নx -> ax (mod b)

এবং Lerch থেকে

যদি bএকটি ধনাত্মক বিজোড় পূর্ণসংখ্যা হয় এবং aএটির একটি পূর্ণসংখ্যা হয়b তবে জ্যাকোবীর প্রতীক (a|b)হ'ল আদেশের চিহ্নx -> ax (mod b)

ব্রুনিয়েট এবং ক্লার্ক দেখুন, চতুর্ভুজ পারস্পরিক পদ্ধতির প্রসারিত করেরেফারেন্সের জন্য রামানুজন জার্নাল 37.1 (2014): 25-50

এবং এটি সহজেই আরও এক ধাপ এগিয়ে যেতে পারে (যদিও আমি এটি সাহিত্যে দেখিনি)

যদি bএকটি ধনাত্মক বিজোড় পূর্ণসংখ্যা হয় এবং aএকটি পূর্ণসংখ্যা হয় তবে জ্যাকোবি প্রতীকটি (a|b)মানচিত্রের লেভি-সিভিটা প্রতীকx -> ax (mod b)

প্রুফ: যদি aকপিরাইট হয়b তবে আমরা জোলোটারেভ-ফ্রোবেনিয়াস-লার্চ ব্যবহার করি; অন্যথায় মানচিত্রটি কোনও অনুক্রম নয় এবং লেভি-সিভিটা প্রতীকটি 0যেমন পছন্দসই রয়েছে তেমন।

এটি জ্যাকোবি প্রতীক গণনা দেয়

{_2m*{~>},@ff*\ff%::-:*g}

তবে বিশেষ চিকিত্সার জন্য প্রয়োজনীয় (a|-1)এবং এর (a|2)অর্থ হ'ল আমি ক্রোনেক্কার প্রতীক গণনার কোনও উপায় খুঁজে পাইনি যা এই পদ্ধতির সাথে সংক্ষিপ্ত: এটি পৃথকভাবে প্রাইমগুলি সংযোজন এবং চিকিত্সা করা থেকে খাটো।


4

পাইথন 3, 747 369 335 বাইট

উদাহরণস্বরূপ উত্তর হিসাবে, কেবল সামান্য গল্ফ হয়েছে এবং আপনাকে উত্তরটি কেমন হবে তার একটি ধারণা দিতে।

এবং হ্যাঁ, প্রাইম ফ্যাক্টরাইজেশন এবং রান-লেংথ-এনকোডিং বিটগুলি পাইথ থেকে আইস্যাকের কাছে ক্ষমা প্রার্থনা করে আঁকানো হয়

from itertools import*
def k(d,r):
 if d<0:a=-d;m=1
 else:a=d;m=0
 if r==1:return 1
 p=1;w=r;n=2;f=[]
 while n*n<=w:
  while w%n<1:w//=n;f+=n,
  n+=1
 if w>1:f+=w,
 z=[[k,len(list(g))]for k,g in groupby(f)]
 for i,j in z:
  if i==2:p*=pow(-1,(a*a-1)//8)
  x=pow(a,(i-1)//2,i)
  if x>1:x-=i
  p*=x**j
 if m:p*=pow(-1,(r-1)//2)
 return p

4
কৈফিয়ত গ্রহণ করা হয়েছে - আমি পাইথের উত্স কোডটি পড়ে খুশি glad
isaacg

2

গণিত, 169 175 165 বাইট

(1|-1)~k~0=_~k~1=1
_~k~0=0
a_~k~-1=If[a<0,-1,1]
a_~k~2=DirichletCharacter[8,2,a]
a_~k~p_/;PrimeQ@p=Mod[a^((p-1)/2),p,-1]
a_~k~b_:=1##&@@(a~k~#^#2&@@@FactorInteger@b)

2

ল্যাবভিউ, 44 বাইট ল্যাবভিউ পুরষ্কার

এর সিমেট্রিকাল যেহেতু আমি ইনপুটগুলি অদলবদল করেছিলাম যদি কোনও খ এর চেয়ে বড় হয়।

এখন আসল সূত্রটি উপস্থাপন করে

সর্বদা মত গণনা

সত্য ক্ষেত্রে


দুর্ভাগ্যক্রমে, (a|b) != (b|a)সব ক্ষেত্রে। বেশিরভাগ ক্ষেত্রে, হ্যাঁ, তবে তাদের সকলের মধ্যে নেই। যদিও আপনি যদি a mod bএগুলি বদলানোর পরিবর্তে হ্রাস করেন তবে এটি কাজ করবে।
শার্লক 9

যেহেতু আমার এখন ব্যাখ্যা আছে আমি এটিকে সম্পাদনা করতে পারি, আমাকে একটি মিনিট দিন
ইউমেল

1
আমি এটি পরীক্ষা করার কোন উপায় আছে কি? ল্যাভভিউ কীভাবে কাজ করে তা আমি সত্যিই বুঝতে পারি না।
শার্লক 9

এটি একটি ভাল প্রশ্ন, আমি 2 উপায় সম্পর্কে ভাবতে পারি। প্রথমে আমি .exe তৈরি করতে পারি এবং এটি আপনার কাছে প্রেরণ করতে পারি, দ্বিতীয়টি আপনি একটি ল্যাবভিউ পরীক্ষার সংস্করণ পেতে পারেন এবং আমি আপনাকে vi পাঠাতে পারি বা আপনি ছবিটি থেকে পুনর্নির্মাণ করতে পারেন।
ইউমেল

7
এটি 44 বাইট নয়। আপনি যদি কোনও স্কোরিং সিস্টেমটি সংজ্ঞায়িত করেন যা ফাইলের আকারের উপর ভিত্তি করে নয়, আপনাকে এটিকে বাইটস বাদে অন্য কিছু বলা উচিত।
শুক্রবার

1

জুলিয়া, 195 বাইট

k(a,b)=b==0?a∈[1,-1]?1:0:b==1?1:b==2?iseven(a)?0:a%8∈[1,-1]?1:-1:b==-1?a<1?-1:1:isprime(b)&&b>2?a%b==0?0:a∈[i^2%b for i=0:b-1]?1:-1:k(a,sign(b))*prod(i->k(a,i)^factor(b)[i],keys(factor(b)))

এটি একটি পুনরাবৃত্ত ফাংশন kযা দুটি পূর্ণসংখ্যা গ্রহণ করে এবং একটি পূর্ণসংখ্যা ফেরত দেয়।

Ungolfed:

function k(a::Integer, b::Integer)
    if b == 0
        return a  [1, -1] ? 1 : 0
    elseif b == 1
        return 1
    elseif b == 2
        return iseven(a) ? 0 : a % 8  [1, -1] ? 1 : -1
    elseif b == -1
        return a < 1 ? -1 : 1
    elseif isprime(b) && b > 2
        return a % b == 0 ? 0 : a  [i^2 % b for i = 1:b-1] ? 1 : -1
    else
        p = factor(b)
        return k(a, sign(b)) * prod(i -> k(a, i)^p[i], keys(p))
    end
end

1

হাস্কেল, 286 বাইট

a#0|abs a==1=1|1<2=0
a#1=1
a#2|even a=0|mod a 8`elem`[1,7]=1|1<2=(-1)
a#b|b<0=a`div`abs a*a#(-b)|all((/=0).mod b)[2..b-1]=if elem n[0,1] then n else(-1)|1<2=product$map(a#)$f b where n=a^(div(b-1)2)`mod`b
f 1=[]
f n|n<0=(-1):f(-n)|1<2=let p=head$filter((==0).mod n)[2..n]in p:f(div n p)

সম্ভবত সম্পূর্ণরূপে অপ্টিমাইজড নয়, তবে একটি সাহসী প্রচেষ্টা। ক্রোনেকার প্রতীকটিকে ইনফিক্স ফাংশন হিসাবে একটি # বি হিসাবে সংজ্ঞায়িত করা হয়, অর্থাৎ

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