Kleinste ganze Zahl als Produkt gegebener Faktoren


17

In letzter Zeit gab es viele Herausforderungen im Zusammenhang mit Prim / Prim-Faktorisierung. Ich dachte, es könnte interessant sein, in die andere Richtung zu gehen.

Gegeben:

  • eine positive ganze Zahl nund
  • eine nicht leere Liste positiver Ganzzahlen f

Schreiben Sie ein vollständiges Programm oder eine Funktion, um die kleinste Ganzzahl iso zu finden, dass i >= nund iein Produkt nichtnegativer ganzzahliger Potenzen von Elementen in ist f.

Beispiele:

  • Angenommen n = 11, f = [2, 3, 5].

    Die ersten Produkte sind:

    1   = 2^0 * 3^0 * 5^0
    2   = 2^1 * 3^0 * 5^0
    3   = 2^0 * 3^1 * 5^0
    5   = 2^0 * 3^0 * 5^1
    4   = 2^2 * 3^0 * 5^0
    6   = 2^1 * 3^1 * 5^0
    10  = 2^1 * 3^0 * 5^1
    9   = 2^0 * 3^2 * 5^0
    15  = 2^0 * 3^1 * 5^1
    25  = 2^0 * 3^0 * 5^2
    8   = 2^3 * 3^0 * 5^0
    12  = 2^2 * 3^1 * 5^0 => smallest greater than (or equal to) 11, so we output it.
    20  = 2^2 * 3^0 * 5^1
    18  = 2^1 * 3^2 * 5^0
    30  = 2^1 * 3^1 * 5^1
    50  = 2^1 * 3^0 * 5^2
    27  = 2^0 * 3^3 * 5^0
    45  = 2^0 * 3^2 * 5^1
    75  = 2^0 * 3^1 * 5^2
    125 = 2^0 * 3^0 * 5^3
    
  • Angenommen n=14, f=[9, 10, 7].

    Wieder die ersten Produkte:

    1 = 7^0 * 9^0 * 10^0
    7 = 7^1 * 9^0 * 10^0
    9 = 7^0 * 9^1 * 10^0
    10 = 7^0 * 9^0 * 10^1
    49 = 7^2 * 9^0 * 10^0  => smallest greater than (or equal to) 14, so we output it.
    63 = 7^1 * 9^1 * 10^0
    70 = 7^1 * 9^0 * 10^1
    81 = 7^0 * 9^2 * 10^0
    90 = 7^0 * 9^1 * 10^1
    100 = 7^0 * 9^0 * 10^2
    

Testfälle:

n, f -> output
10, [2, 3, 5]              -> 10
17, [3, 7]                 -> 21
61, [3,5,2,7]              -> 63
23, [2]                    -> 32
23, [3]                    -> 27
23, [2, 3]                 -> 24
31, [3]                    -> 81
93, [2,2,3]                -> 96
91, [2,4,6]                -> 96
1,  [2,3,5,7,11,13,17,19]  -> 1
151, [20,9,11]             -> 180
11616, [23,32]             -> 12167
11616, [23,32,2,3]         -> 11664 = 2^4 * 3^6
5050, [3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210] -> 5103 = 3^6 * 7
12532159, [57, 34, 12, 21] -> 14183424 = 12^5 * 57

Regeln

  • Sie können davon ausgehen, dass fmindestens ein Element enthalten sein wird und dass alle Elemente von fgrößer als 1 sind.
  • Sie können optional davon ausgehen, dass fdie Sortierung in absteigender / aufsteigender Reihenfolge erfolgt, wenn Sie dies wünschen (aber bitte angeben).
  • Sie können optional die Anzahl der Elemente von nehmen, fwenn Sie möchten.
  • Die Ausgabe als String ist zulässig.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes in jeder Sprache!
  • Es gelten die Standard-E / A-Regeln, und Standard-Regelungslücken sind verboten.
  • Erklärungen sind erwünscht.

Antworten:


10

Schale , 8 Bytes

ḟṠ€ȯmΠṖṘ

Extrem langsam. Probieren Sie es online!

Erläuterung

ḟṠ€ȯmΠṖṘ  Implicit inputs, say L=[3,4] and n=5.
ḟ         Find the lowest integer k≥n that satisfies:
       Ṙ   Replicate L by k: [3,3,3,3,3,4,4,4,4,4]
      Ṗ    Powerset: [[],[3],[4],..,[3,3,3,3,3,4,4,4,4,4]]
    mΠ     Product of each: [1,3,4,..,248832]
 Ṡ€ȯ       k is in this list.

7

Wolfram Language (Mathematica) , 68 65 62 61 Bytes

If[#^#2<=1,1~Max~-Log@#2,Min[#0[#,#2-1,##4],#0[#/#3,##2]#3]]&

Probieren Sie es online!

Wie es funktioniert

Nimmt die Eingabe als [n,k,f1,f2,f3,...,fk](z. B. [11,3,2,3,5]) an: Der erste Wert ist das Ziel n, der zweite die Anzahl der Faktoren, und alle Fraktoren folgen.

Die anderen Herausforderungen der Zahlentheorie haben sich in letzter Zeit zu ausgefallenen Einbauten entwickelt (zumindest wurden sie verwendet FactorInteger), sodass ich dachte, ich würde etwas ausprobieren, das nur grundlegende Tools verwendet. Diese Lösung besagt im Grunde, dass nwir zum Schreiben als Produkt der Faktoren entweder den ersten Faktor verwenden f1(und n/f1dann mit diesem multiplizieren f1) oder nicht (und dann auf eine kürzere Liste von Faktoren zurückgreifen) und dann die min.

Die Rekursion ist beendet, wenn das Ziel kleiner als 1 ist oder wenn die Anzahl der Faktoren 0 ist, nach denen wir #^#2<=1sofort suchen, und dann im ersten Fall 1 und Infinityim letzteren Fall mit 1 generieren 1~Max~-Log@#2.

Die Funktion gibt eine ganze Reihe von Warnungen aus (funktioniert aber immer noch), es sei denn, Sie führen sie mit aus Quiet, da sie schließlich auf Fälle zurückgreift, in denen #3es keine gibt, was den nicht verwendeten zweiten Zweig von Iftraurig macht.


-3 Bytes: Anzahl der Faktoren als Eingabe nehmen.

-3 Bytes dank @ngenisis: using .

-1 Byte und keine Mehrdeutigkeit: die #^#2Prüfung.


2
Sehr schön! speichert 3Bytes über -Log@0 (doesn't work on TIO, but works fine on desktop Mathematica). Also, Tr [1 ^ {##}] `ist ein Byte kürzer als Length@{##}.
Genisis

Ich bin mir nicht ganz sicher, wie ich Optimierungen einsetze, die TIO nicht mag, aber ich werde das hinzufügen. Und #2ist noch kürzer als Tr[1^{##}]. :)
Misha Lawrow

1
Ich denke du solltest mitmachen Quiet in Ihren Hauptcode Diese Antwort gibt zu viele falsche Nachrichten aus. Zumindest fragen Sie OP, ob er damit
einverstanden

2
Es scheint fast so, als würde das Ignorieren von STDERR in einer anderen Sprache erfolgen, was in der Praxis akzeptiert wird .
Mischa Lawrow

2
Das Problem scheint ein Fehler zu sein. Ich werde versuchen, das zu beheben.
Dennis

6

Python 2 , 91 88 84 Bytes

f=lambda n,l:n<2or any(n%x<1and f(n/x,l)for x in l)
g=lambda n,l:n*f(n,l)or g(n+1,l)

Probieren Sie es online!

Die Funktion f prüft rekursiv, ob nein Produkt von Potenzen von Elementen in l, gnur ein Wrapper ist, um die Iteration zu steuern



4

Jelly , 13 Bytes

L⁹ṗ’⁸*P€ḟ⁹Ḷ¤Ṃ

Ein dyadischer Link, der die Liste flinks und die Zahl nrechts aufnimmt und eine Zahl ergibt.

Probieren Sie es online!Golf ineffizient - Zeitüberschreitung bei Eingaben mit höheren nund / oder längeren Werten f.

Wie?

Wir wissen, dass die Kräfte der einzelnen (streng positiven) Faktoren niemals überschritten werden müssen n-1
... Untersuchen wir also einfach alle möglichen Möglichkeiten!

L⁹ṗ’⁸*P€ḟ⁹Ḷ¤Ṃ - Link: list, f; number, n
 ⁹            - chain's right argument, n
L             - length of f
  ṗ           - Cartesian power  ...e.g.: len(f)=2; n=3 -> [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3]]
   ’          - decrement (vectorises)
    ⁸         - chain's left argument, f
     *        - exponentiate (vectorises) - that is [f1^a, f2^b, ...] for each [a, b, ...] in the list formed from the Cartesian power
      P€      - product for €ach - that is f1^a * f2^b * ... for each [a, b, ...] in the list formed from the Cartesian power
           ¤  - nilad followed by link(s) as a nilad:
         ⁹    -   chain's right argument, n
          Ḷ   -   lowered range -> [0,1,2,3,...,n-1]
        ḟ     - filter discard - that is remove values less than n
            Ṃ - minimum

2

Netzhaut , 76 Bytes

\d+
$*
1+;
$&$&
{+`;(1+)(\1)*(?=;.*\b\1\b)
;1$#2$*1
}`(1+);11+;
1$1;1$1;
\G1

Probieren Sie es online! Link schließt die langsamsten Testfälle aus, ist aber immer noch etwas langsam. Versuchen Sie also nicht, auf den Server von @ Dennis einzusteigen.



2

Mathematica, 85 Bytes

Min@Select[Flatten[1##&@@(s^#)&/@Tuples[0~Range~⌈Log[Min[s=#],d=#2]⌉,#3]],#>=d&]&

Eingang

[{liste f}, n, Anzahl der Elemente von f]
[{57, 34, 12, 21}, 12532159, 4]


{d,s}Min@Select[Flatten[1##&@@(s^#)&/@0~Range~9~Tuples~Tr[1^s]],#>=d&]
Genisis

@ngenisis Was ist das Symbol, das nicht angezeigt wird? Können Sie stattdessen eine TIO-Verbindung herstellen?
J42161217

Ich hätte nie gedacht, dass ich den Tag sehen würde, an dem "Mathematica" und "TIO" im selben Beitrag verwendet werden: P
caird coinheringaahing

@ Jenny_mathy Es ist U+F4A1, langer Name \[Function].
Genisis

Verwendung 0~Range~9scheint sehr konservativ. Sollte g[{2,3,5},1001]wirklich überspringen 1024und zurückkehren 1080? Dies ist keine besonders große Eingabe.
Mischa Lawrow

2

Japt , 10 Bytes

_k e!øV}aU

Online testen!

Funktioniert im letzten Testfall aufgrund einer Iterationsbeschränkung nicht, die dafür ausgelegt ist, dass der Interpreter nicht für immer ausgeführt wird (hat hier jedoch nicht viel geholfen, da mein Browser für eine Stunde eingefroren ist ...)

Erläuterung

_k e!øV}aU    Implicit: U = input integer, V = array of factors
_      }aU    Starting at U, find the next integer Z where
 k              the factors of Z
   e            are such that every factor
    !øV         is contained in V (e!øV -> eX{VøX}, where VøX means "V contains X").
              Implicit: output result of last expression



1

Mathematica, 73 Bytes

1±_=1>0;n_±f_:=Or@@(#∣n&&n/#±f&/@f);n_·f_:=NestWhile[#+1&,n,!#±f&]

Im Wesentlichen eine Portierung von Rods Python- Antwort . Definiert zwei binäre Operatoren ±und ·. n±fGibt zurück, Trueob nein Produkt aus Elementen von fund Falseandernfalls ist. n·fgibt die kleinste ganze Zahl an i. Wenn jemand einen Weg finden kann, um den Teilbarkeitstest zu eliminieren, könnte ich durch Verwendung der ISO 8859-1-Codierung 10 Bytes einsparen.

Erläuterung

1±_=1>0;                         (* If the first argument is 1, ± gives True. *)
n_±f_:=Or@@(#∣n&&n/#±f&/@f);     (* Recursively defines ±. *)
                                 (* For each element of f, check to see if it divides n. *)
                                 (* For each element # that does, check if n/# is a product of elements of f. *)
n_·f_:=NestWhile[#+1&,n,!#±f&]   (* Starting with n, keep incrementing until we find an i that satisfies i±f. *)

1

R , 52 Bytes

function(n,f)min((y=(x=outer(f,0:n,"^"))%o%x)[y>=n])

Probieren Sie es online!

Es sind 3 Wochen vergangen, also dachte ich, ich würde endlich meine eigene Lösung veröffentlichen. Dies ist ein Brute-Force-Ansatz.

Es gibt jedoch ein eingebautes:

R , 5 Bytes

nextn

Probieren Sie es online!

Aus den R-Dokumenten:

nextngibt die kleinste ganze Zahl größer oder gleich zurück n, die als Produkt der Potenzen der in enthaltenen Werte erhalten werden kann factors. nextnsoll verwendet werden, um eine geeignete Länge zu finden, um das Argument von fftto auf null zu setzen, damit die Transformation schnell berechnet wird. Der Standardwert für factorsstellt dies sicher.

Einige Tests ergaben jedoch einen Fehler in der Implementierung, wie der obige TIO-Link zeigt.

nextn(91,c(2,6))sollte 96 zurückgeben, gibt jedoch 128 zurück. Dies tritt offensichtlich nur dann auf, wenn factorsnicht alle relativ gut miteinander auskommen. Tatsächlich ist der zugrunde liegende C - Code es offenbart , dass nextngierig versucht jeden zu unterteilen factorwiederum , bis 1erreicht ist:

static Rboolean ok_n(int n, int *f, int nf)
{
    int i;
    for (i = 0; i < nf; i++) {
    while(n % f[i] == 0) {
        if ((n = n / f[i]) == 1)
        return TRUE;
    }
    }
    return n == 1;
}

static int nextn0(int n, int *f, int nf) { while(!ok_n(n, f, nf)) n++; return n; }

Dies kann gelöst werden, indem die Eingaben in absteigender Reihenfolge vorgenommen werden.


1

JavaScript (ES6), 53 50 Bytes

3 Bytes dank @DanielIndie gespeichert

Übernimmt Eingaben in der Currying-Syntax (n)(a).

n=>m=a=>(g=k=>k<n?a.map(x=>g(k*x)):k>m?0:m=k)(1)|m

Testfälle

Wie?

n => a => (                 // given n and a
  g = k =>                  // g = recursive function taking k
    k < n ?                 // if k is less than n:
      a.map(x => g(k * x))  //   recursive calls to g with x * k for each x in a
    :                       // else:
      k > m ?               //   if k is greater than m and m is not set to NaN:
        0                   //     ignore this result
      :                     //   else:
        m = k               //     update m to k
  )(                        // initial call to g with:
    1,                      //   k = 1
    m = +a                  //   m = either NaN or the single integer contained in a
  ) | m                     // return m

n => m = a => (g = k => k <n · a.map (x => g (k · x)): k> m · 0: m = k) (1) | mm = Funktion
Gibt

@ DanielIndie Das sind tatsächlich 50 Bytes. Danke vielmals!
Arnauld
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.