最小公倍数を維持しながら2つの数値を互いに素数にする


20

2つの正の整数を考えるab、出力2つの正の整数cdなるようにします。

  • c 分ける a
  • d 分ける b
  • cそしてd互いに素である
  • 最小公倍数cdの最小公倍数と等しいaとしますb

考えられる答えが複数ある場合は、そのうちの1つまたはすべてを出力できます。

テストケース:

 a  b  c  d
12 18  4  9
18 12  9  4
 5  7  5  7
 3  6  1  6 or 3 2
 9  9  9  1 or 1 9
 6 15  2 15 or 6 5
 1  1  1  1

これはです。バイト単位の最短回答が優先されます。


私が戻るのを止めるのは何ですか(1、LCM)?
ニール

1
@ニールd分割する要件b
リーキー修道女

4
LCMを定義するか、少なくとも頭字語を使用しないでください。何が求められているのか少し知りませんでした。
小麦ウィザード

回答:


7

ゼリー21 13バイト

ÆEz®0iṂ$¦€ZÆẸ

オンラインでお試しください!

もし= 2 A・3 B・5 C・...、B = 2 α・3 β・5 γ・...、そして我々の計算

  • c = 2 A>α?A:0・3 B>β?B:0・5 C>γ?C:0・…

  • d = 2 A>α?0:α・3 B>β?0:β・5 C>γ?0:γ・…

LCM(C、D)= 2 MAX(A>αA:?0、A>α0:?α)・... = 2 MAX(A、α)・3 MAX(B、β)・... = LCM( a、b)

およびgcd(c、d)= 2 min(A>α?A:0、A>α?0:α)・…= 2 0・3 0・5 0・…= 1

つまり、(c、d)=(a、b)から開始します。次に、各素数について、cまたはdの因数分解からその素数をすべて除算します。その素数の最小の指数を持つ方です。(この実装では、同点の場合、cはその指数を失います。)

したがって、a = 2250 = 2 1・3 2・5 3およびb = 360 = 2 3・3 2・5 1

その後、c = 2 0・3 0・5 3 = 125およびd = 2 3・3 2・5 0 = 72です。

ジョナサンアランは、なんと8バイトもゴルフをしました!ありがとう〜


これは私のオリジナルのアルゴリズムです... Perlアルゴリズムの方が優れています。
リーキー修道女

非常に素晴らしい。ここでは12バイトです
ジョナサンアラン

ここでは別の12 byterだÆEZ×Ụ’$€$ZÆẸ
マイル

これにより[1,18]、が得られ[15,18]ます。初期バージョンは正しい答えを返していました([5,18])。
アーナウルド

1
ああ-はい、トランスポーズにゼロのフィラーが必要です。ÆEz®0iṂ$¦€ZÆẸ13のトリックを行う必要があります
ジョナサンアラン

4

R、143の 139 123バイト

f=function(a,b,q=1:(a*b))for(i in 1:a)for(j in 1:b)if(!a%%i+b%%j&max(q[!i%%q+j%%q])<2&i*j==min(q[!q%%a+q%%b]))cat(i,j,"\n")

(19バイトオフの@Giuseppeに感謝します!)

インデント、改行、いくつかの説明付き:

f=function(a,b,
           q=1:(a*b)) #Defined as function arguments defaults to avoid having to use curly brackets
    for(i in 1:a)
        for(j in 1:b)
            if(!a%%i + b%%j & #Is a divided by c and b divided by d
               max(q[!i%%q+j%%q])<2 & #Are c and d coprimes
               i*j==min(q[!q%%a+q%%b])) #Is this the same lcm
                   cat(i,j,"\n") #Then print

テストケース:

> f=function(a,b,q=1:(a*b))for(i in 1:a)for(j in 1:b)if(!a%%i+b%%j&max(q[!i%%q+j%%q])<2&i*j==min(q[!q%%a+q%%b]))cat(i,j,"\n")
> f(5,7)
5 7 
> f(12,18)
4 9 
> f(6,15)
2 15 
6 5 
> f(1,1)
1 1 

!&and よりも優先順位は高くなります|が、+and よりは低くなり*ます。そのようにして、数バイトのゴルフができるはずです。つまり、次!i%%q&j%%qと同等である必要があります!i%%q+j%%q
ジュゼッペ

1
さて、よく観察:if GCD(c,d)==1、then LCM(c,d)==c*d。我々はテストできるようにGCD(c,d)==1して、かどうかを確認しc*d==a*b/GCD(a,b)、後者であることからLCM(a,b)...
ジュゼッペ

1
確かに!(ただし、計算a*b/GCD(a,b)は未満ではありませんLCM(a,b))。
プランナパス

120バイト -匿名関数+ -3バイトのリテラル改行
ジュゼッペ

4

、10バイト

→ÖF§-⌋⌉ΠmḊ

強引な。リストを受け取り、返します。また、3つ以上の数字でも機能します。オンラインでお試しください!

説明

→ÖF§-⌋⌉ΠmḊ  Implicit input, say [6,15]
        mḊ  Map divisors: [[1,2,3,6],[1,3,5,15]]
       Π    Cartesian product:[[1,1],[2,1],[1,3],[2,3],[3,1],[1,5],[3,3],[6,1],[1,15],[2,5],[3,5],[6,3],[2,15],[6,5],[3,15],[6,15]]
 Ö          Sort by
  F         reduce by
     ⌉      lcm
   -⌋       minus gcd: [[1,1],[3,3],[2,1],[1,3],[3,1],[6,3],[1,5],[2,3],[6,1],[2,5],[3,15],[1,15],[3,5],[6,15],[2,15],[6,5]]
→           Get last element: [6,5]

3

Mathematica、82バイト

#&@@Select[Subsets[Flatten@Divisors[{t=#,r=#2}],{2}],GCD@@#==1&&LCM@@#==t~LCM~r&]&

よくわかりませんが、バイトを保存するSelect[...][[1]]代わりにリストインデックスを使用することはできませんFirst@Select[...]か?
ジョナサンフレッチ

はい、しかし、もう1つを保存する#&@@代わりに使用できます[[1]]
;

3

JavaScript(ES6)、90 84 80バイト

カリー化構文の入力を受け取り、(a)(b)2つの整数の配列を返します。

a=>g=(b,c=1)=>(G=(a,b)=>b?G(b,a%b):a)(c,d=a*b/G(a,b)/c)-1|a%c|b%d?g(b,c+1):[c,d]

テストケース

どうやって?

a =>                            // a = first input
  g = (                         // g = recursive function that takes:
    b,                          //   b = second input
    c = 1                       //   c = first output divisor, initially set to 1
  ) =>                          //
    (G = (a, b) =>              // G = function that takes a and b
      b ? G(b, a % b) : a       //     and returns the greatest common divisor
    )(                          // we call it with:
      c,                        //   - c
      d = a * b / G(a, b) / c   //   - d = LCM(a, b) / c = a * b / GCD(a, b) / c
    ) - 1 |                     // if the result is not 1 (i.e. c and d are not coprime)
    a % c |                     // or c does not divide a
    b % d ?                     // or d does not divide b:
      g(b, c + 1)               //   do a recursive call with c + 1
    :                           // else:
      [c, d]                    //   return [c, d], a valid factorization of the LCM


3

ハスケル50 48 47 45 42バイト

(?)=gcd;a!b|c<-div a$a?b=(c*c?b,div b$c?b)

アイデア:私はそれに気づいたc*d = a*b/gcd(a,b)。したがって、アルゴリズムは2つのステップを実行します。

  1. 始まるc' = a/gcd(a,b)d' = b。これは、c'それ以外のすべての要件を満たし、d'互いに素でなければなりません。
  2. それらを互いに素にするために、計算してe = gcd(c',d')からとを設定c = c'*ed = d'/eます。これにより、すべてのプロパティが保持されます(結合された因子は同じままです)が、からすべての共有された因子を削除するのでd、私は作成しcd互いに素にします。

私の実装でc'は、と呼ばれていcます。

オンラインでお試しください!

ライコニのおかげで-3バイト


パターンガードを使用してバインドすると、c3バイト節約されます。オンラインで試してください!
ライコニ

@Laikoni Ooh、私もそのトリックを知りませんでした。ありがとう!
サッチャン


2

R、126バイト

function(a,b,g=function(x,y)ifelse(o<-x%%y,g(y,o),y),l=a*b/g(a,b))matrix(c(C<-(1:l)[!l%%1:l],D<-l/C),,2)[g(C,D)<2&!a%%C+b%%D,]

オンラインでお試しください!

これは、他のR回答よりも値を見つけるために異なる(そして明らかにゴルフっぽくない)アプローチを取ります

説明:

function(a,b){
 G <- function(x,y)ifelse(o<-x%%y,G(y,o),y) #gcd function, vectorized for x,y
 l <- a*b/g(a,b)                            #lcm of a,b
 C <- (1:l)[!l%%1:l]                        #divisors of l
 D <- l/C                                   #l/C is the other half of the pair
 rel_prime <- G(C, D) < 2                   #pairs where C,D are relatively prime, lol, GCD
 a_div <- !a%%C                             #divisors of a
 b_div <- !b%%D                             #divisors of b
 C <- C[rel_prime & a_div & b_div]
 D <- D[rel_prime & a_div & b_div]          #filter out the bad pairs
 matrix(c(C,D),,ncol = 2)                   #matrix of pairs, returned
}

ただし、すべての定義をデフォルト引数として靴べらし、すべての計算を1行で実行してゴルフのようにします。



2

Haskell91 74バイト

a!b=[(x,y)|x<-[1..a],y<-[1..b],rem a x+rem b y+gcd x y<2,lcm a b==lcm x y]

オンラインでお試しください!

保存された17は Laikoniのおかげでバイト


1
u*v`div`gcd u vバイトを保存します。
リン

組み込みlcm関数を使用しない理由はありますか?
ライコニ

また、rem a x+rem b y+gcd x y<2動作するはずです。
ライコニ

@Laikoniには非常に良い理由lcmがあります。組み込みが存在することすら知りませんでした。rem a x+rem b y+gcd x y<2動作し、動作するかどうかのだろうかrem a x+rem b y+gcd x y+lcm a b-lcm x y<2 。あるかもしれないこと(数学)保証がlcm a b>=lcm x y
jferard

1
確かに、lcm a b>=lcm x y1のでx=x1*...*xi(プライム分解)、 y=y1*...yjlcm x y=z1*...*zkどこz1,...,zkに共通しているx1,...,xiy1,...,yj。2. a=u1*...*um*x1*...*xi(プライム分解)、 b=v1*...vn*y1*...yjlcm a b=t1*...*tlどこt1,...,tlに共通しているu1*...*um*x1*...*xiv1*...vn*y1*...yj。つまり、をt1,...,tl含むことは明らかです。しかし、それは条件を合計として書くのには役立ちません。z1,...,zklcm a b>=lcm x y
jferard


1

Python 3、129バイト

lambda a,b:[[c,d]for c in range(1,-~a)for d in range(1,-~b)if((gcd(c,d)<2)*a*b/gcd(a,b)==c*d/gcd(c,d))>a%c+b%d]
from math import*

オンラインでお試しください!またはテストスイートを試してください。

可能なすべての組み合わせをネストされたリストの形式で出力します。


3
あなたとあなたのビット単位のもの... -~a-~b同じように書き換えることができるa+1b+1読みやすさのために:P
スティーブン・

1
@Stephenあなたが見ることができるように、私は専門難読化
氏Xcoder

新しく追加した2番目のテストケースでは機能しません。
リーキー修道女

@LeakyNunロールバック。ゴルフの妥当性をチェックする時間がありませんでした。
ミスターXcoder

1

ゼリー 19 15  14 バイト

-4 漏れの修道女からのポインター -(除数ビルトインを使用)

これが実際にこれを行う方法ではないことはほぼ100%確信していますが、ここに最初の試みがあります。
誰が7または8バイターでゴルフをしているのか見てみましょう!
うん... 説明付きのリンの答えを参照してください!

g/־l/
ÆDp/ÇÐṂ

2つの数値のリストを取得し、可能性のリストのリストを返すモナドリンク。

オンラインでお試しください!

どうやって?

g/־l/  - Link: gcd divided by lcm: list [x, y]
g/      - reduce by gcd = gcd(x, y)
   æl/  - reduce by lcm = lcm(x,y)
  ÷     - divide

ÆDp/ÇÐṂ - Main link: list [a, b]    e.g. [160, 90]
ÆD      - divisors (vectorises)          [[1,2,4,5,8,10,16,20,32,40,80,160],[1,2,3,5,6,9,10,15,18,30,45,90]]
  p/    - reduce by Cartesian product    [[1,1],[1,2],...,[1,90],[2,1],[2,2],...,[2,90],....,[160,90]]
     ÐṂ - entries for which this is minimal:
    Ç   -   call the last link (1) as a monad

誰が7または8バイターでゴルフをしているのか見てみましょう!- Doが...そうは思わない
氏Xcoder

あなたは6だと思いますか?...五?!
ジョナサンアラン

:Pいいえ... 13-15未満は可能だとは思いません(もちろん、デニスは同意しません!)
Xcoder氏

除数が組み込まれていますか?
リーキー修道女

うんÆDなくギアで...明らかに(肩をすくめる)脳
ジョナサン・アラン

1

Perl 6、72バイト

{([X] map {grep $_%%*,1..$_},@^a).grep:{([lcm] @a)==([lcm] $_)==[*] $_}}

オンラインでお試しください!

リスト(a、b)を取得します。可能なすべてのリスト(c、d)のリストを返します。

説明:

-> @ab {
    # Generate all pairs (c, d)
    ([X]
         # where c divides a and d divides b.
         map { grep $_%%*, 1..$_ }, @ab)
    # Only keep pairs with lcm(a, b) = lcm(c, d) and lcm(c, d) = c * d.
    # The latter implies gcd(c, d) = 1.
    .grep: { ([lcm] @ab) == ([lcm] $_) == [*] $_ }
}


1

Python 2 + sympy、148バイト

from sympy import*
a,b=input()
c=d=z=1
while(a/c*c+b/d*d<a+b)+gcd(c,d)-1+(lcm(c,d)!=lcm(a,b)):E=c==d==z;Q=c==z;d=+E or Q+d;c=+Q or-~c;z+=E
print c,d

オンラインでお試しください!

-1 Jonathan Frechに感謝します。

この答えはPython 2(Python 3 ではなく)で機能しsympy.gcdsympy.lcm代わりにmath.gcdand math.lcmを使用し、Python 3でのみ使用可能です。そして、これはブルートフォースです:)



あなたが定義することによってバイトを保存することができる場合がありQ=c==z;、一方、ループの開始時(+7バイト)と交換or(c==z)+dしてor Q+d(-4バイト)c=+(c==z)orc=+Q or(-4バイト)。(TIO
ジョナサンフレッチ

ただ、質問として、あなたが使用している+オペレータのd=+Eか、c=+(c==z)整数にブール値に変換するために?
ジョナサンフレッチ

@JonathanFrechはい、sympy ではTrueandのFalse代わりに1andを使用できないためです0
エリックアウトゴルファー

これは、バニラの+...用途がある最初の例です。
ジョナサンフレッチ

1

ゼリー、13バイト

Ụ€’×
ÆEz0ÇZÆẸ

オンラインでお試しください!私の最初のゼリーの答え!編集:ÆEz0µỤ€’×µZÆẸ13バイトでも機能します。説明:

ÆE              Get prime factor exponents of both values (vectorises)
  z0            Zip but fill the shorter array with 0
    µ           New monadic link
     Ụ€         Grade up each pair (1-indexed)
       ’        Convert to 0-indexing (vectorises)
        ×       Multiply each pair by its grade (vectorises)
         µ      New monadic link
          Z     Zip back into separate lists of prime factor exponents
           ÆẸ   Turn prime exponent lists back into values (vectorises)

1

PARI / GP、86バイト

これは、リンが彼女の答えで言っていることをしているだけです。

f(a,b)=forprime(p=2,a*b,v=valuation(a,p);w=valuation(b,p);if(w<v,b/=p^w,a/=p^v));[a,b]

If I do not count the f(a,b)= part, it is 79 bytes.


1

05AB1E, 32 26 24 22 20 19 bytes

Ó0ζεD`›0sǝ}øεā<ØsmP

Try it online! I still have no idea how to write in this language, but at least it's not a brute-force algorithm. Explanation:

Ó                       Get exponents of prime factors (vectorised)
 0ζ                     Zip, filling with 0
   ε      }             For each prime
    D`                  Extract the pair of exponents
      ›0sǝ              Overwrite the smaller with 0
           ø            Zip back into two lists of prime exponents
            ε           For each list (} implied)
             ā<Ø        Get a list of primes
                sm      Raise each prime to the exponent
                  P     Take the product

What’s it doing?
Lynn

Same as yours, but by actually factorising and comparing the exponents and recombining the factors.
Neil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.