É um fator de um polinômio?


11

Um polinômio é divisível por um fator (x-n)se for f(n)=0para uma função f. Seu trabalho: determinar se uma função polinomial f(x)é divisível por (x-n).

A entrada

A entrada está na forma de (x-n), (Polynomial). Lembre-se, se n for negativo, (x-n)estará na forma de entrada de(x+n) . Para o polinômio, todos os expoentes serão colocados como ^. Os coeficientes serão gravados ao lado da variável x. Um exemplo polinomial poderia ser 2x^2 + x^1. Não haverá espaços entre nada. O termo xserá inserido como x^1. Então, o que "normalmente" olhar como (x - 1)será (x^1-1). Os coeficientes e potências sempre serão inteiros. O coeficiente estará implícito se for justo x. Ou seja, xpode ser interpretado como1x

A saída

Um valor booleano. Verdade ou Falsey.

Graças a @AlexA. Por me ajudar a esclarecer isso!

Exemplos

Input:(x^1-1),(x^1-1)
Output: True

Input: (x^1+2),(2x^2+4x^1+2)
Output: False

Input: (x^1+7),(x^2-49)
Output: True

Regras

  • Isso é , então o código mais curto em bytes ganha

Infelizmente, não sei como implementar o cabeçalho do snippet. Se alguém souber como, fique à vontade para editar a postagem.


A entrada será uma string com essa forma exata, ou seja, parens ao redor do candidato ao divisor, uma vírgula com zero ou um espaço e parens ao redor do polinômio?
Alex A.


Definitivamente não é uma duplicata disso.
Intboolstring

@intrepidcoder Esta não é uma duplicata porque a questão não é fatorar um polinômio. É para ver se um polinômio pode ser dividido por um fator linear.
Intboolstring

Os coeficientes polinomiais sempre serão inteiros?
Digital Trauma

Respostas:


5

Pitão - 39 bytes

Esta é uma combinação monstruosa de regexp e eval. Eu gosto da abordagem, mas tentarei melhorar a implementação.

Ele usa o teorema do restante polinomial .

K_sPe:z"-|\+"3!v.ssXPtw,\^\x,"**""*K"\*

Não funciona online por causa do uso de avaliação.


3

Casio Basic, 19 bytes

judge(mod(b,a)=0

Como se vê, o fx-CP400 pode funcionar modcom expressões algébricas!

Polinômio e fator devem ser inseridos como expressões. 16 bytes para o código, 3 bytes para inserir a,bna caixa de valor do parâmetro.


1

MATLAB, 103 99 97 95 93 bytes

Estou tentando algumas coisas diferentes e consegui que isso funcionasse para economizar alguns bytes:

eval([regexprep(input(''),{'.+?1(.+)\),','(\d)x'},{'x=str2num(''$1'');disp(~','$1\*x'}) 41]);

Se eu puder reduzir isso ainda mais, publicarei uma explicação.


Código antigo uma explicação

t=sscanf(input(''),'(x^1%d),%s')';x=-t(1);disp(~eval(regexprep([t(2:end) ''],'(\d)x','$1\*x')))

Isso também funciona com o Octave . Você pode experimentá-lo online . Salvei o programa como um script chamado isFactor.m, para que você possa entrar isFactorno prompt. [Nota: no Octave emite um aviso durante a execução - o MATLAB não gera isso].

A entrada deve estar no formato '(x^1+7),(x^2-49)'conforme a pergunta. As aspas são adicionadas para que o MATLAB / Octave saiba que é uma string.

A saída é a 0ou a 1dependendo de ser verdadeira ou falsa.


Portanto, o código funciona da seguinte maneira. Primeiro, solicitamos uma entrada e depois a analisamos. A cadeia de análise extrai o número assinado após o primeiro (x^1da cadeia - este é o nosso valor de n. Depois, continua a extrair a string ( %s) após ),a entrada - esta é a nossa expressão.

t=sscanf(input(''),'(x^1%d),%s')';

Em seguida, extraímos o valor de ne definimos xigual a ele - vamos avaliar se a expressão é igual a zero quando n==x, então é por isso que armazenamos o valor em x. Também negamos o número extraído, devido ao sinal de menos ao analisar.

x=-t(1);

Em seguida, exibiremos a saída que é um booleano

disp(

O resultado é basicamente a negação lógica da nossa equação avaliada. Se f(x)for zero, isso retornará 1, caso contrário, resultará em zero.

     ~eval(

Estamos avaliando a expressão de entrada, mas, para fazer isso, precisamos reformatá-la um pouco para que o MATLAB possa entender. Quando lemos a string, na verdade é uma matriz do doubletipo, portanto, precisamos convertê-la em uma matriz de caracteres. Antes da conversão, também nos livramos do primeiro elemento, pois é para isso que usamos n. Precisamos substituir qualquer ocorrência xprecedida por um número (por exemplo 4x) pela mesma coisa, mas com um *sinal de multiplicação ( ) entre eles para que o MATLAB possa calcular.

           regexprep(char([t(2:end) ''],'(\d)x','$1\*x')
     )
)

1

VBScript, 118 116 bytes

a=inputbox(""):for i=0 to 9:a=replace(a,i&"x",i&"*x"):next:b=split(a,","):x=-eval(b(0)):msgbox not cbool(eval(b(1)))

Como sabemos que a primeira parte da entrada é um polinômio linear, precisamos apenas verificar se sua raiz corresponde à do segundo polinômio; e precisamos preparar o termo evalinserindo *conforme necessário.


1

Axiom 77 180 Bytes

f(a:UP(x,INT),b:UP(x,INT)):Boolean==(ground?(a)or ground?(b)=>false;p:=b;r:=a;if degree(a::POLY INT,x)>degree(b::POLY INT,x)then(p:=a;r:=b);(p rem r)$UP(x,FRAC INT)~=0=>false;true)

a solução anterior

v(a,b)==(ground?(a) or ground?(b) or (b rem a)$UP(x,FRAC INT)~=0=>false;true)

estava errado porque assume o grau (b)> = grau (a) um bug que escrevi ... teste e resultados

(3) -> f(x^1-1,x^1-1)
   (3)  true
                                                            Type: Boolean
(4) -> f(x^1+1,2*x^2+4*x^1+2)
   (4)  true
                                                            Type: Boolean
(5) -> f(x^1+2,2*x^2+4*x^1+2)
   (5)  false
                                                            Type: Boolean
(6) -> f(x^1+7,x^2-49)
   (6)  true
                                                            Type: Boolean
(7) -> f(1, 1)
   (7)  false
                                                            Type: Boolean
(8) -> f(1, x^2+1)
   (8)  false
                                                            Type: Boolean
(9) -> f(x^8-1, x^2-1)
   (9)  true
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.