গণনা মডুলার বিপরীত


16

দুটি ধনাত্মক সংখ্যা দেওয়া হয়েছে xএবং এর nসাথে x<2^n, সংখ্যার সবচেয়ে সংক্ষিপ্ততম ফাংশনটি লিখুন x^-1 mod 2^n। অন্য কথায়, এটি yযে এই ধরনের x*y=1 mod 2^n

আপনার ফাংশনটি কমপক্ষে একটি যুক্তিসঙ্গত সময়ে অবশ্যই শেষ n=64করতে হবে, তাই সম্পূর্ণ অনুসন্ধান কাজ করবে না।

যদি বিপরীতটি বিদ্যমান না থাকে, আপনি অবশ্যই কলরটিকে কোনওভাবে এটি নির্দেশ করতে হবে (একটি ব্যতিক্রম ছুঁড়ে ফেলুন, একটি সেন্ডিনেল মান ফিরিয়ে দিন)।

আপনি যদি ভাবছেন যে কোথা থেকে শুরু করবেন, প্রসারিত ইউক্লিডিয়ান অ্যালগোরিদম ব্যবহার করে দেখুন


এটি কয়েকটি গণিত সফটওয়্যারগুলিতে একক বিবৃতি হতে চলেছে
২0

1
@ st0le: ঠিক আছে, এবং আপনাকে এই ধরনের সিস্টেমে এই জাতীয় ফাংশন ব্যবহার করার অনুমতি দেওয়া হবে না। :-D
ক্রিস জেস্টার-ইয়াং

উত্তর:


2

পাইথন 95 89

cআপনার ফাংশন বিপরীতমুখী না হলে 0 প্রদান করে (যেমন যখন x সমান হয়)।

p=lambda x,y,m:y and p(x,y/2,m)**2*x**(y&1)%m or 1
c=lambda x,n:[0,p(x,2**n-1,2**n)][x%2]

3

পাইথন, 29 বাইট

lambda x,n:pow(x,2**n-1,2**n)

এটি এমনকি এক্স এর জন্য 0 প্রদান করে । এটি অয়লরের উপপাদ্যটি ব্যবহার করে, পর্যবেক্ষণ করে যে পাইথনের বিল্টিন দ্রুত মডিউলার ক্ষুদ্রাকৃতির মাধ্যমে 2 ^ n - 1 2 2 ( n - 1) - 1 দ্বারা বিভাজ্য । এটি 7000 বা তার বেশি পরিমাণ এন এর জন্য যথেষ্ট দ্রুত যথেষ্ট যেখানে এটি প্রায় এক সেকেন্ডেরও বেশি সময় নেওয়া শুরু করে।



2

গল্ফস্ক্রিপ্ট (২৩ টি অক্ষর)

{:^((1${\.**2^?%}+*}:f;

অস্তিত্বহীন বিপরীতটির জন্য প্রেরিত ফলাফল 0

এটি ইউলারের উপপাদ্যের একটি সহজ প্রয়োগ । , তাই এক্স - 1x 2 এন - 1 - 1এক্সφ(2এন)1(গেলিক ভাষার2এন)এক্স-1এক্স2এন-1-1(গেলিক ভাষার2এন)

এক্স2-1=(এক্স2-1-1)2×এক্সk=1

{1\:^(@{\.**2^?%}+*}:f;

বা k=2সাথে

{:^((1${\.**2^?%}+*}:f;

আমি অন্য পদ্ধতির উপর কাজ করছি, কিন্তু সেন্ডিনেল আরও কঠিন।

এক্সY1(গেলিক ভাষার2-1)এক্সY{1,1+ +2-1}(গেলিক ভাষার2)এক্সএক্স(Y+ +এক্সY-1)1(গেলিক ভাষার2)Y'=(এক্স+ +1)Y-1

0এক্স1(গেলিক ভাষার20)

এক্স(1-(এক্স+ +1)এনএক্স)1(গেলিক ভাষার2এন)

এক্স+ +1

এটি 19-চর ফাংশন দেয়

{1$)1$?@/~)2@?%}:f;

এক্সx&11

{1$.1&+1$?@/~)2@?%}:f;

এটি মধ্যে সেন্ডিনেল মান বলে মনে হচ্ছে02এন-1 তবে আমি এখনও এটি প্রমাণ করি নি।

01-(এক্স+ +1)এন1-1এন

{1$.1&*)1$?@/~)2@?%}:f;

এনn x f

{..1&*)2$?\/~)2@?%}:f;

1

রুবি - 88 টি অক্ষর

ফাংশনটি ব্যবহার করুন f

def e a,b;a%b==0?[0,1]:(x,y=e(b,a%b);[y,x-(y*(a/b))])end
def f x,n;e(x,2**n)[0]*(x%2)end

লিঙ্কযুক্ত উইকি পৃষ্ঠা থেকে কেবল পুনরাবৃত্তি ফাংশন, ত্রুটিতে 0 প্রদান করে।


আপনি ই: ইনলাইন করে কিছু অক্ষর সংরক্ষণ করতে পারেন (e=->a,b{...})[x,2**n][0]a%b<1পরিবর্তে পরীক্ষা করে একটি অক্ষর সংরক্ষণ করতে পারে a%b==0
হিস্টোক্র্যাট

1

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

_!1=1
x!n|r<-x!div(n+1)2=(2-r*x)*r`mod`2^n

একটি ব্যবহার অ্যালগরিদম Hensel এর থিম উপর ভিত্তি করে , একটি দ্বিতীয় অধীনে এই রান যে প্রতি পুনরাবৃত্তির ডিজিটের সংখ্যা দ্বিগুণ n 30 সম্পর্কে আপ মিলিয়ন !


1

পাইথ , 9 বাইট

.^Et^2Q^2

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

বিপরীত ক্রমে ইনপুট নেয়। অথবা, 9 খুব বাইট: .^EtK^2QK

ব্যাখ্যা

। ^ এবং ^ 2Q ^ 2 - সম্পূর্ণ প্রোগ্রাম।

। ^ - পাওয়ার ফাংশন। পাইথন (পাও) তে একই।
  ই - দ্বিতীয় ইনপুট।
    Q 2Q - এবং 2 ^ প্রথম ইনপুট।
   t - ঘোষিত।
       ^ 2 - এবং 2 ^ প্রথম ইনপুট।

0

জিএপি, 39 বাইট

f:=function(x,n)return 1/x mod 2^n;end;

f(x,n)বিপরীত ফেরৎ xমডিউল 2^nএবং একটি ত্রুটির বার্তা দেয়

Error, ModRat: for <r>/<s> mod <n>, <s>/gcd(<r>,<s>) and <n> must be coprime

যদি কোনও বিপরীত উপস্থিত না থাকে।

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